查看截图。没有批量标准化是蓝线。上部情节的准确性,下部的损失。因此,没有BN,损失会缓慢下降,准确性会慢慢增加,预期的行为。
然后我尝试批量标准化。训练损失收敛到接近零的值。比没有好得多,但是在列车和测试装置上的测试精度都会产生更差的结果。
我的实施基于此:http://ruishu.io/2016/12/27/batchnorm/ 因此,将批量规范添加到这样的层:
h1_p_bn = tf.contrib.layers.batch_norm(h1_p, center=True, scale=True, is_training=self.is_training,scope='bn1')
使用model.is_training一个占位符,在测试精度时将其设置为零(上图)。
我也是这样做的:
# Requirement from tf.contrib.layers.batch_norm
update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
with tf.control_dependencies(update_ops):
# Ensures that we execute the update_ops before performing the train_step
optimizer = tf.train.AdamOptimizer(learning_rate)
self.train_op = optimizer.minimize(self.loss, global_step=global_step)
有任何想法或建议吗?