我正在使用张量流神经网络找出批处理规范化的工作原理,并将其复制到我自己的库中。我遇到了这个奇怪的问题:
初始化神经网络层时,所有偏差(或在batchnorm-beta的情况下)都设置为0,因此该层应仅将输入值乘以权重,就这样。现在,根据我对batchnorm的了解,在训练过程中,它根据所馈送的小批量计算层输入的均值和方差,然后将其输入到输入中:output =(input-mean)/ sqrt(variance + eps)。
因此,如果您的小批量生产的所有输入值都相同,那么在训练期间,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]培训时,
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)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句