训练了一个网络,训练时的测试结果很好。但是保存模型后,测试结果就很差。
仔细检查后发现,测试时把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,而测试时,直接采用了历史值。所以这可能是造成问题的原因。