tensorflow 中的批量归一化在训练期间是否使用 运行 平均值?

Does batch normalization in tensorflow use running averages during training?

我正在使用 tensorflow 神经网络来弄清楚批量归一化的工作原理并将其复制到我自己的库中。我 运行 遇到了这个奇怪的问题:

当您初始化神经网络层时,所有偏差(或者在 batchnorm 的情况下 - beta)都设置为 0,因此该层应该只是将输入值乘以权重,仅此而已。现在,根据我对 batchnorm 的了解,在训练期间,它会根据正在馈送的小批量计算层输入的均值和方差,然后对输入执行此操作:output = (input - mean) / sqrt(variance + 每股收益)。

所以,如果你的 minibatch 的所有输入值都相同,那么在训练期间 batchnorm 将从输入值中减去均值(等于每个值),所以无论输入如何,网络都应该输出 0,对吧?

而且,事实并非如此。事实上,看起来在计算过程中所有的均值都是 0,方差是 1,就好像它使用的是这些值的 运行ning 平均值。 所以,要么我不明白 batchnorm 是如何工作的,要么只是错误地使用了 batchnorm。以下是它在我使用的代码中的初始化方式:

    layer= tflearn.fully_connected(layer, 10, weights_init=w_init)
    layer= tflearn.layers.normalization.batch_normalization(layer)
    layer= tflearn.activations.leaky_relu(layer)

另一个选项是在训练时使用不当,但我想先排除其他可能的解释。

TensorFlow batch norm 实现有一些默认情况下不包含在训练操作依赖项中的更新操作。您必须显式添加依赖项。引用 docs:

[W]hen training, the moving_mean and moving_variance need to be updated. By default the update ops are placed in tf.GraphKeys.UPDATE_OPS, so they need to be added as a dependency to the train_op. Also, be sure to add any batch_normalization ops before getting the update_ops collection. Otherwise, update_ops will be empty, and training/inference will not work properly. For example:

  x_norm = tf.layers.batch_normalization(x, training=training)

  # ...

  update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
  with tf.control_dependencies(update_ops):
    train_op = optimizer.minimize(loss)