踩坑: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利用itchat对微信中好友数据实现简单分析的方法
Nov 21 Python
python+opencv识别图片中的圆形
Mar 25 Python
python cs架构实现简单文件传输
Mar 20 Python
python 图像平移和旋转的实例
Jan 10 Python
python实时获取外部程序输出结果的方法
Jan 12 Python
安装docker-compose的两种最简方法
Jul 30 Python
python 列表推导式使用详解
Aug 29 Python
Django对接支付宝实现支付宝充值金币功能示例
Dec 17 Python
Tensorflow 1.0之后模型文件、权重数值的读取方式
Feb 12 Python
Python利用FFT进行简单滤波的实现
Feb 26 Python
python实现翻译word表格小程序
Feb 27 Python
Python使用xlrd实现读取合并单元格
Jul 09 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
ThinkPHP自定义函数解决模板标签加减运算的方法
2015/07/03 PHP
PHP中创建和验证哈希的简单方法实探
2015/07/06 PHP
thinkphp3.x中session方法的用法分析
2016/05/20 PHP
由JavaScript技术实现的web小游戏(不含网游)
2010/06/12 Javascript
javascript jq 弹出层实例
2013/08/25 Javascript
Jquery效果大全之制作电脑健康体检得分特效附源码下载
2015/11/02 Javascript
JS遍历数组及打印数组实例分析
2016/01/21 Javascript
jQuery EasyUI中的日期控件DateBox修改方法
2016/11/09 Javascript
JavaScript原型继承_动力节点Java学院整理
2017/06/30 Javascript
基于JavaScript实现百度搜索框效果
2020/06/28 Javascript
简单实现jQuery手风琴效果
2017/08/18 jQuery
javascript 开发之网页兼容各种浏览器
2017/09/28 Javascript
使用Vue实现移动端左滑删除效果附源码
2019/05/16 Javascript
vue登录以及权限验证相关的实现
2019/10/25 Javascript
JavaScript交换两个变量方法实例
2019/11/25 Javascript
python字符串连接的N种方式总结
2014/09/17 Python
Python 由字符串函数名得到对应的函数(实例讲解)
2017/08/10 Python
TensorFlow实现RNN循环神经网络
2018/02/28 Python
把csv文件转化为数组及数组的切片方法
2018/07/04 Python
python实现随机梯度下降法
2020/03/24 Python
python 自定义异常和异常捕捉的方法
2018/10/18 Python
Python空间数据处理之GDAL读写遥感图像
2019/08/01 Python
python字符串格式化方式解析
2019/10/19 Python
python使用turtle库绘制奥运五环
2020/02/24 Python
django实现模型字段动态choice的操作
2020/04/01 Python
解决python虚拟环境切换无效的问题
2020/04/30 Python
简单几步用纯CSS3实现3D翻转效果
2019/01/17 HTML / CSS
借助HTML5 Canvas API制作一个简单的猜字游戏
2016/03/25 HTML / CSS
HTML5单选框、复选框、下拉菜单、文本域的实现代码
2020/12/01 HTML / CSS
三星英国官网:Samsung英国
2018/09/25 全球购物
俄罗斯三星品牌商店:GalaxyStore
2020/11/04 全球购物
什么是URL
2015/12/13 面试题
我们的节日国庆活动方案
2014/08/19 职场文书
不遵守课堂纪律的检讨书
2014/09/24 职场文书
笔记本自带的win11如何跳过联网激活?
2022/04/20 数码科技