踩坑: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 web框架学习笔记
May 03 Python
利用Python实现颜色色值转换的小工具
Oct 27 Python
python抓取文件夹的所有文件
Feb 27 Python
使用pandas对两个dataframe进行join的实例
Jun 08 Python
python读取并写入mat文件的方法
Jul 12 Python
python3 requests库文件上传与下载实现详解
Aug 22 Python
python使用pip安装模块出现ReadTimeoutError: HTTPSConnectionPool的解决方法
Oct 04 Python
python基于K-means聚类算法的图像分割
Oct 30 Python
Python获取对象属性的几种方式小结
Mar 12 Python
Python3+selenium实现cookie免密登录的示例代码
Mar 18 Python
解决pymysql cursor.fetchall() 获取不到数据的问题
May 15 Python
python通用数据库操作工具 pydbclib的使用简介
Dec 21 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
雄兵连:天使彦天使彦为爱折翼,彦和炙心同时念动的誓言!
2020/03/02 国漫
一个简单的PHP投票程序源码
2007/03/11 PHP
PHP获取POST数据的几种方法汇总
2015/03/03 PHP
PHP版本升级到7.x后wordpress的一些修改及wordpress技巧
2015/12/25 PHP
tp5.1 框架数据库-数据集操作实例分析
2020/05/26 PHP
基于JQuery的抓取博客园首页RSS的代码
2011/12/01 Javascript
jquery xMarquee实现文字水平无缝滚动效果
2014/04/29 Javascript
深入理解JavaScript系列(28):设计模式之工厂模式详解
2015/03/03 Javascript
JavaScript在浏览器标题栏上显示当前日期和时间的方法
2015/03/19 Javascript
JavaScript判断表单为空及获取焦点的方法
2016/02/12 Javascript
在ASP.NET MVC项目中使用RequireJS库的用法示例
2016/02/15 Javascript
jQuery实现鼠标跟随提示层效果代码(可显示文本,Div,Table,Html等)
2016/04/18 Javascript
jQuery实现鼠标经过购物车出现下拉框代码(推荐)
2016/07/21 Javascript
Wireshark基本介绍和学习TCP三次握手
2016/08/15 Javascript
jQuery flip插件实现的翻牌效果示例【附demo源码下载】
2016/09/20 Javascript
jQuery Ajax前后端使用JSON进行交互示例
2017/03/17 Javascript
详解使用vue脚手架工具搭建vue-webpack项目
2017/05/10 Javascript
详解React-Router中Url参数改变页面不刷新的解决办法
2018/05/08 Javascript
我要点爆”微信小程序云开发之项目建立与我的页面功能实现
2019/05/26 Javascript
JS回调函数原理与用法详解【附PHP回调函数】
2019/07/20 Javascript
解决VUEX的mapState/...mapState等取值问题
2020/07/24 Javascript
用Python中的字典来处理索引统计的方法
2015/05/05 Python
使用Python机器学习降低静态日志噪声
2018/09/29 Python
实例讲解Python中浮点型的基本内容
2019/02/11 Python
python爬虫用mongodb的理由
2020/07/28 Python
加拿大著名时装品牌:SOIA & KYO
2016/08/23 全球购物
百日安全活动总结
2014/05/04 职场文书
乡镇爱国卫生月活动总结
2014/06/25 职场文书
争先创优活动总结
2014/08/27 职场文书
教师党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
销售会议开幕词
2015/01/28 职场文书
学校党支部承诺书
2015/04/30 职场文书
交通处罚决定书
2015/06/24 职场文书
军训阅兵新闻稿
2015/07/17 职场文书
导游词之青岛崂山
2019/12/27 职场文书
用python基于appium模块开发一个自动收取能量的小助手
2021/09/25 Python