我是卷积神经网络的新手,只是想知道特征映射以及如何对图像进行卷积以提取特征。我很高兴知道在CNN中应用批量标准化的一些细节。
我阅读了本文https://arxiv.org/pdf/1502.03167v3.pdf并且能够理解应用于数据的BN算法,但最后他们提到在应用于CNN时需要稍作修改:
对于卷积层,我们还希望归一化遵循卷积属性 - 以便在不同位置对同一要素图的不同元素以相同方式进行归一化。为实现这一目标,我们联合规范了所有地点的小批量激活。在Alg。在图1中,我们将B作为特征映射中所有值的集合,跨越小批量和空间位置的元素 - 因此对于小批量m的小批量和大小为p×q的特征映射,我们使用有效值 - 小型m'= | B |的小批量= m·pq。我们学习每个特征图的一对参数γ(k)和β(k),而不是每次激活。 ALG。类似地修改图2,以便在推理期间,BN变换对给定特征映射中的每次激活应用相同的线性变换。
他们说的时候我很困惑 “以便在不同位置对相同要素图的不同元素进行相同的规范化”
我知道哪些特征映射意味着什么,不同的元素是每个特征映射中的权重。但我无法理解什么位置或空间位置意味着什么。
我根本无法理解下面的句子 “在Alg.1中,我们让B为特征地图中所有值的集合,跨越小批量和空间位置的元素”
如果有人冷静地阐述并用更简单的术语解释我,我会很高兴
答案 0 :(得分:53)
让我们从条款开始。请记住,卷积层的输出是4级张量[B, H, W, C]
,其中B
是批量大小,(H, W)
是要素图大小,{ {1}}是频道数量。索引C
其中(x, y)
和0 <= x < H
是空间位置。
现在,这里是如何以通常的方式应用batchnorm(伪代码):
0 <= y < W
基本上,它会计算# t is the incoming tensor of shape [B, H, W, C]
# mean and stddev are computed along 0 axis and have shape [H, W, C]
mean = mean(t, axis=0)
stddev = stddev(t, axis=0)
for i in 0..B-1:
out[i,:,:,:] = norm(t[i,:,:,:], mean, stddev)
个H*W*C
元素之间的H*W*C
标准偏差。您可能会注意到,不同空间位置的不同元素有自己的均值和方差,只收集B
个值。
这种方式完全有可能。但卷积层具有特殊属性:在输入图像中共享滤镜权重(您可以在this post中详细阅读)。这就是为什么以相同的方式对输出进行标准化的合理性,以便每个输出值在不同位置采用B
值的均值和方差。
这里是代码在这种情况下的样子(再次是伪代码):
B*H*W
总的来说,只有# t is still the incoming tensor of shape [B, H, W, C]
# but mean and stddev are computed along (0, 1, 2) axes and have just [C] shape
mean = mean(t, axis=(0, 1, 2))
stddev = stddev(t, axis=(0, 1, 2))
for i in 0..B-1, x in 0..H-1, y in 0..W-1:
out[i,x,y,:] = norm(t[i,x,y,:], mean, stddev)
平均值和标准偏差,每一个都是C
值计算出来的。当他们说有效的小批量&#34;时,他们的意思是:两者之间的区别仅在于轴选择(或者等同于#34;小批量选择&#34;)。 / p>
答案 1 :(得分:1)
我只有70%肯定我说的话,所以如果它没有意义,请在downvoting之前编辑或提及它。
关于location
或spatial location
:它们表示图像或要素图中像素的位置。特征映射与表示概念的稀疏修改版本的图像相当。
关于so that different elements of the same feature map, at different locations, are normalized in the same way
:
一些归一化算法是局部的,因此它们依赖于它们的近距离(位置)而不是图像中相距很远的东西。它们可能意味着每个像素,无论它们的位置如何,都被视为一组元素,而与它的直接特殊环境无关。
关于In Alg. 1, we let B be the set of all values in a feature map across both the elements of a mini-batch and spatial locations
:他们得到了一个关于小批量中每个训练样例的每个值的平面列表,这个列表将它们在位置上的位置组合在一起。
答案 2 :(得分:1)
对Maxim的答案作了一些澄清。
在Keras中看到您指定的轴是通道轴,使我感到困惑,因为对通道进行规范化没有意义-因为conv-net中的每个通道都被认为是不同的“功能”。即所有通道的归一化等同于归一化以平方英尺为单位的卧室数量(来自安德鲁ML课程的多元回归示例)。通常这不是您想要的-您要做的是单独对每个功能进行标准化。即您将所有示例中的卧室数量标准化为mu = 0和std = 1,将所有示例中的平方英尺标准化为mu = 0和std = 1。
这就是为什么要C的均值和标准差,因为您想要每个通道/功能的均值和标准差。
我自己检查和测试后,意识到了问题所在:这里有些困惑/误解。您在Keras中指定的轴实际上是计算中不是的轴。即您获得除此参数指定的轴以外的所有轴的平均值。这很令人困惑,因为这与NumPy的工作方式正好相反,其中指定的轴是您对其进行操作的轴(例如np.mean,np.std等)。
我实际上建立了一个仅具有BN的玩具模型,然后手动计算了BN-取平均值,所有三个第一个维度[m,n_W,n_H]的std并得到n_C个结果,计算得出(X-mu)/ std(使用广播),结果与Keras结果相同。
希望这对像我一样困惑的人有所帮助。
答案 3 :(得分:0)