batchnormalization 一定要注意

训练了一个网络,训练时的测试结果很好。但是保存模型后,测试结果就很差。

仔细检查后发现,测试时把model.eval() 改为model.train(), 效果就好了。肯定是batchnormalization 造成的。

为什么在训练时,结果正常呢?因为训练的时候,momentum 的默认参数是0.1. 观察如下两个式子。 

        moving_mean = momentum * moving_mean + (1.0 - momentum) * mean
        moving_var = momentum * moving_var + (1.0 - momentum) * var
我们可以知道,训练时的均值受到历史值的影响比例只有0.1,而测试时,直接采用了历史值。所以这可能是造成问题的原因。

posted on 2020-09-23 21:03  兔子二  阅读(436)  评论(0编辑  收藏  举报

导航