踩坑: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实现的使用telnet登陆聊天室实例
Jun 17 Python
Python3安装Scrapy的方法步骤
Nov 23 Python
python 3利用Dlib 19.7实现摄像头人脸检测特征点标定
Feb 26 Python
python3获取当前文件的上一级目录实例
Apr 26 Python
Python随机函数random()使用方法小结
Apr 29 Python
Python基于property实现类的特性操作示例
Jun 15 Python
Python拼接字符串的7种方法总结
Nov 01 Python
pandas通过loc生成新的列方法
Nov 28 Python
Django实现学员管理系统
Feb 26 Python
python实现代码统计程序
Sep 19 Python
Python3.6 + TensorFlow 安装配置图文教程(Windows 64 bit)
Feb 24 Python
python爬虫实例之获取动漫截图
May 31 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之第一天
2006/10/09 PHP
发款php蜘蛛统计插件只要有mysql就可用
2010/10/12 PHP
Smarty模板学习笔记之Smarty简介
2014/05/20 PHP
2个Codeigniter文件批量上传控制器写法例子
2014/07/25 PHP
PHP标准类(stdclass)用法示例
2016/09/28 PHP
Redis构建分布式锁
2017/03/28 PHP
网站被恶意镜像怎么办 php一段代码轻松搞定(全面版)
2018/10/23 PHP
总结JavaScript中布尔操作符||与&&的使用技巧
2015/11/17 Javascript
javascript html5摇一摇功能的实现
2016/04/19 Javascript
全面了解JavaScript的数据类型转换
2016/07/01 Javascript
AngularJS实现ajax请求的方法
2016/11/22 Javascript
实例解析angularjs的filter过滤器
2016/12/14 Javascript
Bootstrap模态框案例解析
2017/03/05 Javascript
更改BootStrap popover的默认样式及popover简单用法
2018/09/13 Javascript
Angular6 发送手机验证码按钮倒计时效果实现方法
2019/01/08 Javascript
python操作数据库之sqlite3打开数据库、删除、修改示例
2014/03/13 Python
python调用机器喇叭发出蜂鸣声(Beep)的方法
2015/03/23 Python
Python调用命令行进度条的方法
2015/05/05 Python
Python随手笔记第一篇(2)之初识列表和元组
2016/01/23 Python
Python random模块用法解析及简单示例
2017/12/18 Python
解决python爬虫中有中文的url问题
2018/05/11 Python
修复 Django migration 时遇到的问题解决
2018/06/14 Python
对python for 文件指定行读写操作详解
2018/12/29 Python
pyqt5 删除layout中的所有widget方法
2019/06/25 Python
详解Python二维数组与三维数组切片的方法
2019/07/18 Python
python numpy之np.random的随机数函数使用介绍
2019/10/06 Python
python爬虫scrapy图书分类实例讲解
2020/11/23 Python
HTML5如何为形状图上颜色怎么绘制具有颜色和透明度的矩形
2014/06/23 HTML / CSS
美国高级音响品牌:Master&Dynamic
2018/07/05 全球购物
模具毕业生推荐信
2014/02/15 职场文书
人事专员的岗位职责
2014/03/01 职场文书
和睦家庭事迹
2014/05/14 职场文书
团结主题班会
2015/08/13 职场文书
2016思想纪律作风整顿心得体会
2016/01/23 职场文书
如何写好开幕词?
2019/06/24 职场文书
golang 语言中错误处理机制
2021/08/30 Golang