我想知道,在卷积神经网络中,批量归一化是否应该分别应用于每个像素,或者我应该取每个通道的像素平均值?
我在Tensorflow的tf.layers.batch_normalization的描述中看到建议对通道执行bn,但如果我没记错的话,我使用了另一种方法,效果很好。
在图像 CNN 中,通道内的归一化很有帮助,因为权重是跨通道共享的。 另一篇论文的图显示了我们如何与 BN 打交道。有助于更好地理解。
图取自
Wu, Y. 和 He, K.,2018。群体标准化。 arXiv 预印本 arXiv:1803.08494.
据我所知,在前馈(密集)层中,每个单元(神经元)都应用批量归一化,因为每个单元都有自己的权重。因此,您可以跨特征轴进行标准化。
但是,在卷积层中,权重在输入之间是“共享”的,即每个特征图对不同输入的“体积”应用相同的变换。因此,您可以使用每个特征图的均值和方差来应用批量归一化,而不是每个单元/神经元。 这就是为什么我猜测
axis
参数值存在差异。
在亲自检查和测试之后,我意识到问题是什么:这里有一些困惑/误解。您在 Keras 中指定的轴实际上是不在计算中的轴。即,除了此参数指定的轴之外,您将获得每个轴的平均值。这很令人困惑,因为它与 NumPy 的工作方式完全相反,其中指定的轴是您执行操作的轴(例如 np.mean、np.std 等)。编辑:检查这个答案这里。
我实际上构建了一个只有 BN 的玩具模型,然后手动计算 BN - 取所有 3 个第一维度 [m, n_W, n_H] 的平均值,std 并得到 n_C 结果,计算出 (X-mu)/std (使用广播)并得到与 Keras 结果相同的结果。 所以我对此非常确定。
其他答案已经澄清,该约定确实是 BatchNorm2D 在所有其他维度上标准化每个通道。在这里我想展示我的解释和可视化来解释为什么会这样。
TLDR; 对于形状为 (B, F, S) = (批量大小, 特征数量, 特征大小) 的输入张量 X。 S可以代表0个或多个维度。 Batch Norm k-D(k 是自然数)独立标准化 F 轴上的
每个特征,计算 B 轴和 S 上的平均值和标准差。 从其名称来看,显然我们在 B 维度上进行了标准化。
我们还对 S 维度进行标准化,因为我们将每个特征视为一个整体。1-D 输入:形状 (B, F=E, S=T) 的 X,例如 Conv1D/RNN/Transformer 的时间序列数据/输出。 E 是潜在/嵌入维度,T 是时间步长。每个特征都是一个一维向量,因此 S=(T)。