我一直在尝试在 tensorflow 中使用批量标准化,但没有成功。训练损失很好地收敛(比没有 BN 更好),但测试损失在整个训练过程中仍然很高。我正在使用 1 的批量大小,但更大的批量大小仍然会出现问题。我目前正在做的是:
inputs = tf.layers.batch_normalization(
inputs=inputs, axis=1 if data_format == 'channels_first' else 3,
momentum== 0.997, epsilon=1e-5, center=True,
scale=True, training=is_training, fused=True)
inputs = tf.nn.relu(inputs)
is_training 是 tf.placeholder,我在训练期间分配给 True,在测试期间分配给 False,对于训练操作,我这样做:
update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
with tf.control_dependencies(update_ops):
train_op = optimizer.minimize(loss, global_step=batch)
我也尝试过“tf.contrib.layers.batch_norm”,以及我在网上找到的其他几种 BN 实现。但没有任何效果..我总是遇到同样的问题。
我知道在训练期间正在更新 beta 和 gamma 变量。但我也注意到 tf.get_collection(tf.GraphKeys.MOVING_AVERAGE_VARIABLES) 是一个空集合,这很奇怪。
有没有人见过并解决过这个问题?我想不出还有什么可以尝试的。
注意:我知道问题出在 BN 上,因为没有它,测试损失与训练的收敛性不如预期。