我一直在尝试在张量流中使用批量标准化,但没有成功。 训练损失很好地收敛(比没有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上,因为如果没有它,测试损失会随着训练的增加而减少。