我的模型训练好了之后,保存下来重新载入权重进行预测,准确率会下降几个点,在训练集上的表现也是如此,这是为什么呢? 请大佬们指点。

我刚刚训练好了一个模型,训练时训练集上的表现是99,然后保存下来重新载入再训练集上的表现却是77,这很奇怪,随后我将模型载入继续训练一个epoch,训练时训练集仍是99,说明模型没有问题呀,为啥会出现这样子的差异呢?


检查下是不是模型没有设置model.eval()

再检查下什么情况下保存的权重。有可能模型不是在最优点保存的。


有没有确定把模型调为测试模式呢?( model.eval() )


你两种测试准确率的方法一致吗


有可能是因为在网路中使用了 bn,bn 在更新的时候有一个 running_mean 和 running_var 表示该层的 均值和方差,在训练过程中的更新方式为在官方文档中是如下形式:

也就是

new running_mean = (1 - momentum) x old running_mean + momentum x 本次计算出来的 mean。

可以尝试在训练时设置 bn 函数的 momentum 参数大一些如 0.5,或者适当增加一些训练步数让bn曾的参数收敛。

参考资料

BatchNorm2d - PyTorch 1.7.0 documentation


训练时99,保存后载入是77,这是差了22个点吗?

载入后再训练一个epoch是99,那是不是保存的模型是最后一个epoch前的模型?

有没有使用「以在验证集上表现最好的模型保存」的策略?

在验证集上的表现情况和训练集的表现一致吗?

可以考虑在用pytorch保存的时候保存一些其他参数,如保存时的epoch数,loss数等。因为pytorch保存是用pickle做串列化,所以可以用dict把需要的参数都存起来,载入出来的还是一个dict,很方便。


训练和测试的时候用的测试代码是一样的吗?训练的时候测试代码加上eval了吗?再或者就是载入数据的时候?


推荐阅读:
相关文章