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

Why batch normalization over channels only in CNN

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

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

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

但是,在卷积层中,权重在输入之间 共享 ,即每个特征图对不同输入的 "volume" 应用相同的变换。因此,您使用每个 特征图 的均值和方差而不是每个 unit/neuron.

来应用批归一化

这就是我猜测 axis 参数值存在差异的原因。

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

图取自

Wu, Y. and He, K., 2018. Group normalization. arXiv preprint arXiv: 1803.08494.

我为此困惑了几个小时,因为对每个通道进行归一化是没有意义的——因为 conv-net 中的每个通道都被认为是不同的“特征”。 IE。对所有通道进行归一化相当于对卧室数量 大小进行归一化(以平方英尺为单位)(来自 Andrew 的 ML 课程的多元回归示例)。这不是归一化所做的——你所做的是单独归一化每个特征。 IE。您将所有示例中的卧室数量标准化为 mu=0 和 std=1,并将所有示例中的平方英尺标准化​​为 mu=0 和 std=1。

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

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

所以我很确定这一点。