12

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

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

4

3 回答 3

22

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

来自 Group Normalization 论文的图

图取自

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

于 2018-04-13T19:26:20.790 回答
9

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

但是,在卷积层中,权重在输入之间共享,即每个特征图将相同的变换应用于不同输入的“体积”。因此,您使用每个特征图的均值和方差来应用批量归一化,而不是每个单位/神经元。

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

于 2017-10-26T07:46:36.207 回答
6

我对此感到困惑了几个小时,因为对每个通道进行标准化是没有意义的——因为 conv-net 中的每个通道都被认为是不同的“特征”。即对所有通道进行归一化相当于对卧室数量进行归一化,平方英尺为单位(来自 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 结果相同的结果。

所以我很确定这一点。

于 2019-10-19T08:59:41.440 回答