Kub*_*uba 7 machine-learning convolution computer-vision batch-normalization
我想知道,在卷积神经网络中,是否应该对每个像素分别应用批量归一化,还是应该对每个通道取像素的平均值?
我在 Tensorflow 的tf.layers.batch_normalization的描述中看到,建议对通道执行 bn,但如果我没记错的话,我使用了另一种方法,效果很好。
小智 16
在用于图像的 CNN 中,通道内归一化是有帮助的,因为权重跨通道共享。另一篇论文中的图显示了我们如何处理 BN。有助于更好地理解。

图取自
Wu, Y. 和 He, K.,2018 年。组规范化。arXiv 预印本 arXiv:1803.08494。
据我所知,在前馈(密集)层中,每个单元(神经元)应用批量归一化,因为每个单元都有自己的权重。因此,您可以跨特征轴进行标准化。
但是,在卷积层中,权重在输入之间共享,即每个特征图对不同输入的“体积”应用相同的变换。因此,您使用每个特征图的均值和方差来应用批量归一化,而不是每个单元/神经元。
这就是为什么我猜axis参数值存在差异。
我对此感到困惑了几个小时,因为对每个通道进行标准化是没有意义的——因为卷积网络中的每个通道都被认为是不同的“特征”。即,对所有通道进行归一化相当于对以平方英尺为单位的卧室数量进行归一化(来自 Andrew 的 ML 课程的多元回归示例)。这不是标准化所做的——你所做的是标准化每个特征本身。即,您将所有示例中的卧室数量标准化为 mu=0 和 std=1,并将所有示例中的平方英尺标准化为 mu=0 和 std=1。
在我自己检查和测试之后,我意识到问题是什么:这里有一些混淆/误解。您在 Keras 中指定的轴实际上是不在计算中的轴。即,除了此参数指定的轴之外,您将获得每个轴的平均值。这很令人困惑,因为它与 NumPy 的工作方式完全相反,其中指定的轴是您执行操作的轴(例如 np.mean、np.std 等)。编辑:在这里检查这个答案。
我实际上构建了一个只有 BN 的玩具模型,然后手动计算 BN - 取所有 3 个第一维度 [m, n_W, n_H] 的平均值,std 并得到 n_C 结果,计算 (X-mu)/std (使用广播)并得到与 Keras 结果相同的结果。
所以我对此非常确定。