踩坑: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写的一个文本编辑器
Jan 23 Python
python版简单工厂模式
Oct 16 Python
centos 安装python3.6环境并配置虚拟环境的详细教程
Feb 22 Python
django模板结构优化的方法
Feb 28 Python
python3+selenium自动化测试框架详解
Mar 17 Python
Django框架中间件定义与使用方法案例分析
Nov 28 Python
Python web如何在IIS发布应用过程解析
May 27 Python
基于Python模拟浏览器发送http请求
Nov 06 Python
python 实现围棋游戏(纯tkinter gui)
Nov 13 Python
Pycharm安装python库的方法
Nov 24 Python
pytorch 如何使用amp进行混合精度训练
May 24 Python
python 判断字符串当中是否包含字符(str.contain)
Jun 01 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
WML,Apache,和 PHP 的介绍
2006/10/09 PHP
function.inc.php超越php
2006/12/09 PHP
VPS中使用LNMP安装WordPress教程
2014/12/28 PHP
PHP加密解密函数详解
2015/10/28 PHP
js中将URL中的参数提取出来作为对象的实现代码
2011/08/16 Javascript
九种js弹出对话框的方法总结
2013/03/12 Javascript
jQuery动态星级评分效果实现方法
2015/08/06 Javascript
JS获取数组最大值、最小值及长度的方法
2015/11/24 Javascript
JavaScript中iframe实现局部刷新的几种方法汇总
2016/01/06 Javascript
JS中的forEach、$.each、map方法推荐
2016/04/05 Javascript
js实现九宫格的随机颜色跳转
2017/02/19 Javascript
Angular 4依赖注入学习教程之FactoryProvider配置依赖对象(五)
2017/06/04 Javascript
解决ztree搜索中多级菜单展示不全问题
2017/07/05 Javascript
mongoose更新对象的两种方法示例比较
2017/12/19 Javascript
vue v-for 使用问题整理小结
2019/08/04 Javascript
react实现同页面三级跳转路由布局
2019/09/26 Javascript
小程序瀑布流组件实现翻页与图片懒加载
2020/05/19 Javascript
javascript解析json格式的数据方法详解
2020/08/07 Javascript
python获取当前日期和时间的方法
2015/04/30 Python
Python实现中文数字转换为阿拉伯数字的方法示例
2017/05/26 Python
Numpy之文件存取的示例代码
2018/08/03 Python
在Pycharm中执行scrapy命令的方法
2019/01/16 Python
两个元祖T1=('a', 'b'),T2=('c', 'd')使用匿名函数将其转变成[{'a': 'c'},{'b': 'd'}]的几种方法
2019/03/05 Python
Python3.5文件读与写操作经典实例详解
2019/05/01 Python
python3-flask-3将信息写入日志的实操方法
2019/11/12 Python
使用PyTorch实现MNIST手写体识别代码
2020/01/18 Python
Python 实现网课实时监控自动签到、打卡功能
2020/03/12 Python
Python猫眼电影最近上映的电影票房信息
2020/09/18 Python
关于iframe跨域使用postMessage的实现
2019/10/29 HTML / CSS
Trunki英国官网:儿童坐骑式行李箱
2017/05/30 全球购物
2014最新股权信托合同协议书
2014/11/18 职场文书
小学三八妇女节活动总结
2015/02/06 职场文书
《全神贯注》教学反思
2016/02/22 职场文书
pytest进阶教程之fixture函数详解
2021/03/29 Python
如何使用php生成zip压缩包
2021/04/21 PHP
只需要这一行代码就能让python计算速度提高十倍
2021/05/24 Python