踩坑:pytorch中eval模式下结果远差于train模式介绍


Posted in Python onJune 23, 2020

首先,eval模式和train模式得到不同的结果是正常的。我的模型中,eval模式和train模式不同之处在于Batch Normalization和Dropout。Dropout比较简单,在train时会丢弃一部分连接,在eval时则不会。Batch Normalization,在train时不仅使用了当前batch的均值和方差,也使用了历史batch统计上的均值和方差,并做一个加权平均(momentum参数)。在test时,由于此时batchsize不一定一致,因此不再使用当前batch的均值和方差,仅使用历史训练时的统计值。

我出bug的现象是,train模式下可以收敛,但一旦在测试中切换到了eval模式,结果就很差。如果在测试中仍沿用train模式,反而可以得到不错的结果。为了确保是程序bug而不是算法本身就不适合于预测,我在测试时再次使用了训练集,正常情况下此时应发生过拟合,正确率一定会很高,然而eval模式下正确率仍然很低。参照网上的一些说法(Performance highly degraded when eval() is activated in the test phase
),我调大了batchsize,降低了BN层的momentum,检查了是否存在不同层使用相同BN层的bug,均不见效。有一种方法说应在BN层设置track_running_stats为False,它虽然带来了好的效果,但实际上它只不过是不用eval模式,切回train模式罢了,所以也不对。

学习了在训练过程中,如何将BN层中统计的均值和方差输出。即在forward()中,

# bn是一个BN层,torch.nn.batch_normalization(...)
print(bn.running_mean)
print(bn.running_var)

同时学习了如何输出一个Tensor自身的均值和方差,即

# x是一个Tensor,dims是需要计算的维度
print(x.cpu().detach().numpy().mean(dims)
print(x.cpu().detach().numpy().var(dims)

观察每一层的输出结果,发现出现了很大的方差,才猛然意识到自己的输入数据没有做归一化(事后想想也确实如此,毕竟模型和训练方法都是github上参考别人的,出错概率很小;反而是自己写的DataSet部分,其实是最容易出错的)。给模型加上归一化后,eval和train的结果就没有问题了。

再次验证了我的观点:越是玄学的问题,越是傻逼的bug。

补充知识:Pytorch中的train和eval用法注意点

1.介绍

一般情况,model.train()是在训练的时候用到,model.eval()是在测试的时候用到

2.用法

如果模型中没有类似于BN这样的归一化或者Dropout,model.train()和model.eval()可以不要(建议写一下,比较安全),并且model.train()和model.eval()得到的效果是一样

如果模型中有类似于BN这样的归一化或者Dropout,并且程序需要边训练和边测试,最好就是用model.eval()测试完之后,后面补一个model.train()。

其中model.train()是保证BN用每一批数据的均值和方差,而model.eval()是保证BN用全部训练数据的均值和方差;而对于Dropout,model.train()是随机取一部分网络连接来训练更新参数,而model.eval()是利用到了所有网络连接(结果是取了平均)

以上这篇踩坑:pytorch中eval模式下结果远差于train模式介绍就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python在不同层级目录import模块的方法
Jan 31 Python
开源Web应用框架Django图文教程
Mar 09 Python
Python使用django框架实现多人在线匿名聊天的小程序
Nov 29 Python
Python+OpenCV实现车牌字符分割和识别
Mar 31 Python
对python 生成拼接xml报文的示例详解
Dec 28 Python
关于pytorch多GPU训练实例与性能对比分析
Aug 19 Python
python循环嵌套的多种使用方法解析
Nov 29 Python
pytorch 状态字典:state_dict使用详解
Jan 17 Python
Python用input输入列表的实例代码
Feb 07 Python
python读取多层嵌套文件夹中的文件实例
Feb 27 Python
基于Tensorflow读取MNIST数据集时网络超时的解决方式
Jun 22 Python
Anaconda使用IDLE的实现示例
Sep 23 Python
pytorch掉坑记录:model.eval的作用说明
Jun 23 #Python
Python使用Selenium实现淘宝抢单的流程分析
Jun 23 #Python
python2和python3哪个使用率高
Jun 23 #Python
python使用QQ邮箱实现自动发送邮件
Jun 22 #Python
浅谈keras中loss与val_loss的关系
Jun 22 #Python
python实现简易版学生成绩管理系统
Jun 22 #Python
python能否java成为主流语言吗
Jun 22 #Python
You might like
根德Grundig S400/S500/S700电路分析
2021/03/02 无线电
通过ODBC连接的SQL SERVER实例
2006/10/09 PHP
PHP下利用shell后台运行PHP脚本,并获取该脚本的Process ID的代码
2011/09/19 PHP
脚本之家贴图转换+转贴工具用到的js代码超级推荐
2007/04/05 Javascript
Javascript 表单之间的数据传递代码
2008/12/04 Javascript
前端开发的开始---基于面向对象的Ajax类
2010/09/17 Javascript
js querySelector和getElementById通过id获取元素的区别
2012/04/20 Javascript
jQuery动画效果-slideUp slideDown上下滑动示例代码
2013/08/28 Javascript
js实现点小图看大图效果的思路及示例代码
2013/10/28 Javascript
js实现单击图片放大图片的方法
2015/02/17 Javascript
基于jQuery实现仿百度首页换肤背景图片切换代码
2015/08/25 Javascript
jquery实现的点击翻书效果代码
2015/11/04 Javascript
JS实现动态表格的添加,修改,删除功能(推荐)
2016/06/15 Javascript
基于JS快速实现导航下拉菜单动画效果附源码下载
2016/10/27 Javascript
Bootstrap modal 多弹窗之叠加关闭阴影遮罩问题的解决方法
2017/02/27 Javascript
详解jquery选择器的原理
2017/08/01 jQuery
Vue 中mixin 的用法详解
2018/04/23 Javascript
webpack4打包vue前端多页面项目
2018/09/17 Javascript
小程序数据通信方法大全(推荐)
2019/04/15 Javascript
webpack-mvc 传统多页面组件化开发详解
2019/05/07 Javascript
Windows上配置Emacs来开发Python及用Python扩展Emacs
2015/11/20 Python
Python cookbook(数据结构与算法)对切片命名清除索引的方法
2018/03/13 Python
利用Python如何批量更新服务器文件
2018/07/29 Python
Python3 获取一大段文本之间两个关键字之间的内容方法
2018/10/11 Python
六行python代码的爱心曲线详解
2019/05/17 Python
解决webdriver.Chrome()报错:Message:'chromedriver' executable needs to be in Path
2019/06/12 Python
pyqt5使用按钮进行界面的跳转方法
2019/06/19 Python
CSS3实现多样的边框效果
2018/05/04 HTML / CSS
施华洛世奇新加坡官网:SWAROVSKI新加坡
2020/10/06 全球购物
工商企业管理实习自我鉴定
2013/12/04 职场文书
2014年个人思想工作总结
2014/11/27 职场文书
工作检讨书大全
2015/01/26 职场文书
新闻简讯格式及范文
2015/07/22 职场文书
MySQL 角色(role)功能介绍
2021/04/24 MySQL
Jupyter notebook 不自动弹出网页的解决方案
2021/05/21 Python
GitHub上77.9K的Axios项目有哪些值得借鉴的地方详析
2021/06/15 Javascript