Python tensorflow中的批次标准化是否在培训期间使用运行平均值?

Python tensorflow中的批次标准化是否在培训期间使用运行平均值?,python,tensorflow,neural-network,tflearn,batch-normalization,Python,Tensorflow,Neural Network,Tflearn,Batch Normalization,我正在使用一个tensorflow神经网络来弄清楚批处理规范化是如何工作的,并将其复制到我自己的库中。我遇到了一个奇怪的问题: 当你初始化一个神经网络层时,所有的偏差(或者在batchnorm-Beta的情况下)都被设置为0,所以这个层应该把输入值乘以权重,就这样。现在,根据我对batchnorm的理解,在训练过程中,它根据正在输入的小批次计算图层输入的平均值和方差,然后对输入进行此操作:输出=(输入-平均值)/sqrt(方差+每股收益) 因此,如果minibatch的所有输入值都相同,那么在训

我正在使用一个tensorflow神经网络来弄清楚批处理规范化是如何工作的,并将其复制到我自己的库中。我遇到了一个奇怪的问题:

当你初始化一个神经网络层时,所有的偏差(或者在batchnorm-Beta的情况下)都被设置为0,所以这个层应该把输入值乘以权重,就这样。现在,根据我对batchnorm的理解,在训练过程中,它根据正在输入的小批次计算图层输入的平均值和方差,然后对输入进行此操作:输出=(输入-平均值)/sqrt(方差+每股收益)

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

但事实并非如此。事实上,在计算过程中,所有的平均值都是0,而方差是1,就好像它使用的是这些值的运行平均值一样。 所以,要么我不理解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批处理规范实现有一些更新操作,默认情况下不包括在培训操作的依赖项中。您必须显式地添加依赖项。引用

[W] 训练时,需要更新
移动平均值
移动方差
。 默认情况下,更新操作放置在
tf.GraphKeys.update\u ops
中,因此 需要将它们作为依赖项添加到
训练操作中。还有,一定要
在获取
更新操作之前添加任何
批处理操作
收集否则,
update\u ops
将为空,并且 培训/推理将无法正常工作。例如:


TensorFlow批处理规范实现有一些更新操作,默认情况下不包括在培训操作的依赖项中。您必须显式地添加依赖项。引用

[W] 训练时,需要更新
移动平均值
移动方差
。 默认情况下,更新操作放置在
tf.GraphKeys.update\u ops
中,因此 需要将它们作为依赖项添加到
训练操作中。还有,一定要
在获取
更新操作之前添加任何
批处理操作
收集否则,
update\u ops
将为空,并且 培训/推理将无法正常工作。例如:

  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)