我正在使用张量流神经网络来弄清楚批处理规范化的工作原理,并将其复制到我自己的库中。我遇到了这个奇怪的问题:
初始化神经网络层时,所有偏差(或在batchnorm-beta的情况下)都设置为0,因此该层应仅将输入值乘以权重,就这样。现在,根据我对Batchnorm的了解,在训练过程中,它根据正在馈送的最小批处理计算层输入的均值和方差,然后对输入进行此操作:输出=(输入-均值)/ sqrt(方差+ eps)。
因此,如果您的小批量生产的所有输入值都相同,那么在训练批处理时,bordernorm将从输入值中减去平均值(等于每个值),因此,无论输入如何,网络都应输出0,对吧? / p>
而且,事实并非如此。实际上,看起来在计算过程中所有均值均为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)
另一种选择是,它在训练过程中使用不正确,但是我想首先消除其他可能的解释。
答案 0 :(得分:4)
TensorFlow批处理规范实现具有默认情况下不包含在训练操作的依赖项中的一些更新操作。您必须显式添加依赖项。引用docs:
[W]训练时,
moving_mean
和moving_variance
需要更新。 默认情况下,更新操作位于tf.GraphKeys.UPDATE_OPS
中,因此 需要将它们添加为对train_op
的依赖。另外,请确保 在获得batch_normalization
之前添加任何update_ops
操作 采集。否则,update_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)