machine-learning - Keras/TensorFlow BatchNormalization 正在规范化什么

标签 machine-learning tensorflow keras conv-neural-network batch-normalization

我的问题是 BatchNormalization (BN) 正在标准化什么。

我问,BN 是单独对每个像素的 channel 进行归一化,还是对所有像素一起归一化。它是在每个图像的基础上还是在整个批处理的所有 channel 上执行此操作。

具体来说,BN 是在 X 上运行的。比如说,X.shape = [m,h,w,c]。因此,使用 axis=3 时,它在“c”维度上运行,即 channel 数(对于 RGB)或特征图数。

假设 X 是 RGB,因此有 3 个 channel 。 BN 是否执行以下操作:(这是 BN 的简化版本,用于讨论维度方面。我知道 gamma 和 beta 是学习的,但这里不关心它。)

对于m中的每个image=X:

  1. 对于每个像素 (h,w),取相关 r、g 和 b 值的平均值。
  2. 对于每个像素 (h,w),取相关 r、g 和 b 值的方差
  3. 执行r = (r-mean)/var, g = (g-mean)/var, & b = (b-mean)/var,其中 r、g 和 b 分别是 X 的红色、绿色和蓝色 channel 。
  4. 然后对 m 中的下一张图像重复此过程,

在 keras 中,BatchNormalization 的文档说:

axis: Integer, the axis that should be normalized (typically the features axis).

For instance, after a Conv2D layer with data_format="channels_first", set axis=1 in BatchNormalization.

但是它在每个维度上到底做了什么?

最佳答案

首先,有几种应用批量标准化的方法,original paper 中甚至提到了这些方法。专门用于卷积神经网络。请参阅 this question 中的讨论,它概述了通常卷积 BN 之间的区别,以及这两种方法都有意义的原因。

特别是keras.layers.BatchNormalization实现卷积 BN,这意味着对于输入[m,h,w,c],它计算c的均值和标准差m*h*w 值。运行均值、运行 std dev 以及 gamma 和 beta 变量的形状只是 (c,)。跨空间维度(像素)以及跨批处理的值是共享的。

因此,更准确的算法是:对于每个 R、G 和 B channel ,计算该 channel 中所有像素和所有图像的均值/方差,并应用归一化。

关于machine-learning - Keras/TensorFlow BatchNormalization 正在规范化什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47312922/

相关文章:

python - 从 model.ckpt.meta 中提取图形 def

arrays - 如何计算两个重叠线性数据集之间的点?

python - 为什么在tensorflow(python)中调用decode_cvs后没有()?

machine-learning - 一起或分开标准化/分解训练/测试?

tensorflow 挂起。我可以采取哪些措施来调试该问题

deep-learning - Keras LSTM : dropout vs recurrent_dropout

python - U网: how to improve accuracy of multiclass segmentation?

python - Keras - 操作系统错误 : cannot identify image file

machine-learning - 基于配置文件对列表进行排序的推荐规则

python - 神经网络的多维输入