踩坑: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 相关文章推荐
Django imgareaselect手动剪切头像实现方法
May 26 Python
python从入门到精通(DAY 2)
Dec 20 Python
在阿里云服务器上配置CentOS+Nginx+Python+Flask环境
Jun 18 Python
python的mysqldb安装步骤详解
Aug 14 Python
Python+Redis实现布隆过滤器
Dec 08 Python
python wxpython 实现界面跳转功能
Dec 17 Python
flask 实现上传图片并缩放作为头像的例子
Jan 09 Python
Python如何使用OS模块调用cmd
Feb 27 Python
Python使用socketServer包搭建简易服务器过程详解
Jun 12 Python
Python+Dlib+Opencv实现人脸采集并表情判别功能的代码
Jul 01 Python
彻底解决pip下载pytorch慢的问题方法
Mar 01 Python
Python进程间的通信之语法学习
Apr 11 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
php中对xml读取的相关函数的介绍一
2008/06/05 PHP
解析php防止form重复提交的方法
2013/07/01 PHP
php使用str_replace实现输入框回车替换br的方法
2014/11/24 PHP
PHP Web木马扫描器代码分享
2015/09/06 PHP
10个超级有用的PHP代码片段果断收藏
2015/09/23 PHP
javascript 鼠标悬浮图片显示原图 移出鼠标后原图消失(多图)
2009/12/28 Javascript
javascript利用初始化数据装配模版的实现代码
2010/11/17 Javascript
删除条目时弹出的确认对话框
2014/06/05 Javascript
一个很有趣3D球状标签云兼容IE8
2014/08/22 Javascript
JavaScript事件委托实例分析
2015/05/26 Javascript
JS正则表达式学习之贪婪和非贪婪模式实例总结
2016/12/26 Javascript
JS实现移动端触屏拖拽功能
2018/07/31 Javascript
js指定日期增加指定月份的实现方法
2018/12/19 Javascript
每天学点Vue源码之vm.$mount挂载函数
2019/03/11 Javascript
JS实现canvas简单小画板功能
2020/06/23 Javascript
express异步函数异常捕获示例详解
2020/11/30 Javascript
python 基础教程之Map使用方法
2017/01/17 Python
Python实现读取json文件到excel表
2017/11/18 Python
Python 查找字符在字符串中的位置实例
2018/05/02 Python
Python使用min、max函数查找二维数据矩阵中最小、最大值的方法
2018/05/15 Python
Django利用elasticsearch(搜索引擎)实现搜索功能
2020/11/26 Python
美国最大的无人机经销商:DroneNerds
2018/03/20 全球购物
NFL官方在线商店:NFLShop
2020/07/29 全球购物
了解AppleTalk协议吗
2014/04/01 面试题
PHP使用Redis队列执行定时任务实例讲解
2021/03/24 PHP
出国考察邀请函
2014/01/21 职场文书
经典广告词大全
2014/03/14 职场文书
社会稳定风险评估方案
2014/06/02 职场文书
优秀毕业生的求职信
2014/07/21 职场文书
园艺专业毕业生求职信
2014/09/02 职场文书
正风肃纪查摆剖析材料
2014/10/10 职场文书
公司放假通知范文
2015/04/14 职场文书
交通事故起诉书
2015/05/19 职场文书
CSS实现漂亮的时钟动画效果的实例代码
2021/03/30 HTML / CSS
多表查询、事务、DCL
2021/04/05 MySQL
单机多实例部署 MySQL8.0.20
2022/05/15 MySQL