解决Pytorch中的神坑:关于model.eval的问题
有时候使用Pytorch训练完模型,在测试数据上面得到的结果令人大跌眼镜。
这个时候需要检查一下定义的Model类中有没有 BN 或 Dropout 层,如果有任何一个存在
那么在测试之前需要加入一行代码:
#model是实例化的模型对象 model = model.eval()
表示将模型转变为evaluation(测试)模式,这样就可以排除BN和Dropout对测试的干扰。
因为BN和Dropout在训练和测试时是不同的:
对于BN,训练时通常采用mini-batch,所以每一批中的mean和std大致是相同的;而测试阶段往往是单个图像的输入,不存在mini-batch的概念。所以将model改为eval模式后,BN的参数固定,并采用之前训练好的全局的mean和std;
对于Dropout,训练阶段,隐含层神经元先乘概率P,再进行激活;而测试阶段,神经元先激活,每个隐含层神经元的输出再乘概率P。
如下图所示:
补充:pytorch中model.eval之后是否还需要model.train的问题
答案是:需要的
正确的写法是
for循环之后再开启train,
循环之后的评估model.eval之后就会再次回到model.train
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
Python使用OpenCV对彩色图像进行通道分离的项目实践
通道分离是将彩色图像的每个像素分解为三个通道(红、绿、蓝)的过程,本文主要介绍了Python使用OpenCV对彩色图像进行通道分离的项目实践,感兴趣的可以了解一下2023-08-08windows10在visual studio2019下配置使用openCV4.3.0
这篇文章主要介绍了windows10在visual studio2019下配置使用openCV4.3.0,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2020-07-07Python可视化Matplotlib折线图plot用法详解
这篇文章主要为大家介绍了Python可视化中Matplotlib折线图plot用法的详解,有需要的朋友可以借鉴参考下,希望可以有所帮助,祝大家多多进步2021-09-09
最新评论