前言:
{
最近在训练自己的模型,但是评估结果很不理想(虽然训练时表现的结果已经很不错了)。在网上查了查,发现了tensorflow里batch normalization的一些特点。
}
正文:
{
根据我自己的理解,batch normalization的作用是根据统计数据使得输入数据的分布标准化(具体信息参考[1][2])。为了提高模型的性能,tensorflow的inceptionV3和inceptionV4(我现在正在用)中引入了batch normalization。
当使用inceptionV4进行评估时,我得到的效果很差(训练时的准确率为0.7左右,但使用同样的训练样本进行评估的准确率只有大概0.1)。这个问题困扰了我很久,而且在用inceptionV4之前好像没遇到这个问题。后来我发现,只要像训练中一样把is_training设为true就正常了。
我搜索了一下,发现了一些资料[3][4]。[4]的第一个回答(目前只有一个)中提到了用slim.learning.create_train_op来代替原始的优化步骤,其目的是在于在训练时同时更新集合tf.GraphKeys.UPDATE_OPS(这个集合也是需要更新的,具体见[5][6])。
值得注意的是,[6]中说在评估中:虽然训练和评估中batch normalization都会起作用,但在评估模式中batch normalization根据的是之前训练统计的数据(见图1)。我这时想到了我的训练方式和数据,训练阶段和评估阶段的数据分布完全不一样,这就会导致效果差。
}
结语:
{
其实我还有一些疑点:
- 在[7]中我并没有看到添加的batch normalization层,但在arg_scope中却对slim.batch_norm进行了设置(见图2),可能slim会在某些层后自动添加batch normalization层吧。
- 图2中的代码也设置了droput,不知道效果差是不是和droput。
参考资料:
{
[1] https://www.cnblogs.com/guoyaohua/p/8724433.html
[2] https://arxiv.org/pdf/1502.03167.pdf
[3] https://github.com/tensorflow/models/issues/3556
[5] https://stackoverflow.com/questions/33949786/how-could-i-use-batch-normalization-in-tensorflow
[6] http://ruishu.io/2016/12/27/batchnorm/
[7] https://github.com/tensorflow/models/blob/master/research/slim/nets/inception_v4.py
}
}