背景【可以忽略】
最近,我花了一个月的时间在解决这样一个问题——“在代码的Train部分,每个一个epoch结束,我会使用第三方的数据集【例如:SOD数据集】进行test。而在代码的Test部分,我加载Train得到的模型权重,然后在对同一个第三方数据集进行test。两者结果不一致!!!!!”
都说数据是不会骗人的,所以肯定是我的原因造成的。我从代码的加载,预训练。。。。。整个流程进行了一一排查,发现结果竟是因为这个。。。。。。。。。。。。。。。。。
model.train()和model.eval()
model.train() :启用 BatchNormalization 和 Dropout
model.eval() :不启用 BatchNormalization 和 Dropout
两个函数,第一个是在train之中调用,另一个在test时调用。特别注意,一旦test时就需要使用model.eval()。因为它可以阻止BN和Dropout操作,从而使网络中所有的参数都一致。