在TensorFlow中,如何正确地按批次进行批量归一化?(即我不希望计算运行中的均值和方差)。我当前的实现是基于tf.nn.batch_normalization
,其中x
是一个卷积层的输出,形状为[batch_size, width, height, num_channels]
。我希望按通道进行批量归一化。
batch_mean, batch_var = tf.nn.moments(x, axes=[0, 1, 2])x = tf.nn.batch_normalization(x, batch_mean, batch_var, offset=0, scale=0, variance_epsilon=1e-6)
但这种实现的结果非常差。与tensorflow.contrib.slim.batch_norm
的比较显示,它的表现远不如后者(同样差的训练性能)。
我做错了什么?有什么可以解释这种糟糕的表现吗?
回答:
@某人的解决方案是有效的,但我发现它很慢。以下是一个简单且快速的解决方案。
batch_mean, batch_var = tf.nn.moments(x, axes=[0, 1, 2])x = tf.subtract(x, batch_mean)x = tf.div(x, tf.sqrt(batch_var) + 1e-6)