为什么仅在 CNN 中对通道进行批量归一化

问题描述 投票:0回答:4

我想知道,在卷积神经网络中,批量归一化是否应该分别应用于每个像素,或者我应该取每个通道的像素平均值?

我在Tensorflow的tf.layers.batch_normalization的描述中看到建议对通道执行bn,但如果我没记错的话,我使用了另一种方法,效果很好。

machine-learning computer-vision convolution batch-normalization
4个回答
24
投票

在图像 CNN 中,通道内的归一化很有帮助,因为权重是跨通道共享的。 另一篇论文的图显示了我们如何与 BN 打交道。有助于更好地理解。

figure from Group Normalization paper

图取自

Wu, Y. 和 He, K.,2018。群体标准化。 arXiv 预印本 arXiv:1803.08494.


12
投票

据我所知,在前馈(密集)层中,每个单元(神经元)都应用批量归一化,因为每个单元都有自己的权重。因此,您可以跨特征轴进行标准化。

但是,在卷积层中,权重在输入之间是“共享”的,即每个特征图对不同输入的“体积”应用相同的变换。因此,您可以使用每个特征图的均值和方差来应用批量归一化,而不是每个单元/神经元。 这就是为什么我猜测

axis

参数值存在差异。

    


6
投票

在亲自检查和测试之后,我意识到问题是什么:这里有一些困惑/误解。您在 Keras 中指定的轴实际上是不在计算中的轴。即,除了此参数指定的轴之外,您将获得每个轴的平均值。这很令人困惑,因为它与 NumPy 的工作方式完全相反,其中指定的轴是您执行操作的轴(例如 np.mean、np.std 等)。编辑:检查这个答案这里

我实际上构建了一个只有 BN 的玩具模型,然后手动计算 BN - 取所有 3 个第一维度 [m, n_W, n_H] 的平均值,std 并得到 n_C 结果,计算出 (X-mu)/std (使用广播)并得到与 Keras 结果相同的结果。 所以我对此非常确定。

其他答案已经澄清,该约定确实是 BatchNorm2D 在所有其他维度上标准化每个通道。在这里我想展示我的解释和可视化来解释为什么会这样。

0
投票

TLDR; 对于形状为 (B, F, S) = (批量大小, 特征数量, 特征大小) 的输入张量 X。 S可以代表0个或多个维度。 Batch Norm k-D(k 是自然数)独立标准化 F 轴上的

每个特征

,计算 B 轴和 S 上的平均值和标准差 从其名称来看,显然我们在 B 维度上进行了标准化。

我们还对 S 维度进行标准化,因为我们将每个特征视为一个整体。
  • 我们
  • 不会在 F 维度上进行标准化
  • ,因为不同的特征应该有不同的均值和标准差。
  • 使用常用符号的示例:
0-D 输入:形状为 (B, F, 1) 的 X,例如全连接层的表格数据/输出。每个特征都是一个数字,因此特征大小 S=(1)。

1-D 输入:形状 (B, F=E, S=T) 的 X,例如 Conv1D/RNN/Transformer 的时间序列数据/输出。 E 是潜在/嵌入维度,T 是时间步长。每个特征都是一个一维向量,因此 S=(T)。
  • 2-D 输入:X 形状(B,F=C,(W,H)=S),例如图像。这里S代表二维(W,H)图像的宽度和高度。每个特征都是一个二维矩阵,因此 S=(W, H)。
  • 这是 0 维到 2 维情况的可视化:

BatchNorm k-D Visualized

© www.soinside.com 2019 - 2024. All rights reserved.