【问题探究】tensorflow中batch normalization的特点

前言:

{

    最近在训练自己的模型,但是评估结果很不理想(虽然训练时表现的结果已经很不错了)。在网上查了查,发现了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)。我这时想到了我的训练方式和数据,训练阶段和评估阶段的数据分布完全不一样,这就会导致效果差。

图1

}

 

结语:

{

    其实我还有一些疑点:

  1. 在[7]中我并没有看到添加的batch normalization层,但在arg_scope中却对slim.batch_norm进行了设置(见图2),可能slim会在某些层后自动添加batch normalization层吧。
  2. 图2中的代码也设置了droput,不知道效果差是不是和droput。
图2

    参考资料:

    {

        [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

        [4] https://stackoverflow.com/questions/42770757/tensorflow-batch-norm-does-not-work-properly-when-testing-is-training-false

        [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

    }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值