卷积神经网络中的批量归一化

时间:2016-07-24 15:54:59

标签: machine-learning computer-vision deep-learning conv-neural-network batch-normalization

我是卷积神经网络的新手,只是想知道特征映射以及如何对图像进行卷积以提取特征。我很高兴知道在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为特征地图中所有值的集合,跨越小批量和空间位置的元素”

如果有人冷静地阐述并用更简单的术语解释我,我会很高兴

4 个答案:

答案 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个值。

处于转换层的Batchnorm

这种方式完全有可能。但卷积层具有特殊属性:在输入图像中共享滤镜权重(您可以在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之前编辑或提及它。

关于locationspatial 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)

  1. 首先,我们需要清楚地说明,内核的深度是由上一个特征图的通道号确定的,而这一层中的内核数决定了下一个特征图(下一层)的通道号。
  2. 然后我们应该清楚地说明,每个内核(通常是3维)将在下一层中仅生成一个特征图通道。
  3. 第三,我们应该尝试接受在生成的特征图中的每个点(无论它们的位置如何)都是由同一内核通过在上一层滑动生成的想法。因此,它们可以看作是此内核生成的分布,也可以看作是随机变量的样本。然后,应将它们取平均值以获得均值,然后是方差。 (它不是严格的,仅有助于理解) 他们就是这样说的,“以便以相同的方式对同一要素图的不同元素在不同位置进行归一化”。