踩坑: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爬虫代理IP池实现方法
Jan 05 Python
Python实现的递归神经网络简单示例
Aug 11 Python
python matplotlib画图实例代码分享
Dec 27 Python
python机器学习理论与实战(六)支持向量机
Jan 19 Python
python调用xlsxwriter创建xlsx的方法
May 03 Python
对Python Pexpect 模块的使用说明详解
Feb 14 Python
在python 中split()使用多符号分割的例子
Jul 15 Python
Pandas+Matplotlib 箱式图异常值分析示例
Dec 09 Python
python 图像的离散傅立叶变换实例
Jan 02 Python
python GUI库图形界面开发之PyQt5打开保存对话框QFileDialog详细使用方法与实例
Feb 27 Python
Python使用pycharm导入pymysql教程
Sep 16 Python
Python数据分析入门之教你怎么搭建环境
May 13 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
自己动手,丰衣足食 - 短波框形天线制作
2021/03/01 无线电
新版PHP将向Java靠拢
2006/10/09 PHP
如何取得中文字符串中出现次数最多的子串
2013/08/08 PHP
php实例分享之mysql数据备份
2014/05/19 PHP
PHP资源管理框架Assetic简介
2014/06/12 PHP
php+mysqli事务控制实现银行转账实例
2015/01/29 PHP
PHP制作百度词典查词采集器
2015/01/29 PHP
PHP判断网络文件是否存在的方法
2015/03/12 PHP
ThinkPHP模板Volist标签嵌套循环输出多维数组的方法
2016/03/23 PHP
Prototype 学习 工具函数学习($方法)
2009/07/12 Javascript
在页面中输出当前客户端时间javascript实例代码
2016/03/02 Javascript
针对BootStrap中tabs控件的美化和完善(推荐)
2016/07/06 Javascript
javascript如何创建对象
2016/08/29 Javascript
微信小程序 MINA文件结构
2016/10/17 Javascript
12306 刷票脚本及稳固刷票脚本(防挂)
2017/01/04 Javascript
js实现控制文件拖拽并获取拖拽内容功能
2018/02/17 Javascript
vue 数据操作相关总结
2020/12/17 Vue.js
python实现保存网页到本地示例
2014/03/16 Python
在Python操作时间和日期之asctime()方法的使用
2015/05/22 Python
python3使用matplotlib绘制散点图
2019/03/19 Python
解决Django生产环境无法加载静态文件问题的解决
2019/04/23 Python
Flask框架学习笔记之模板操作实例详解
2019/08/15 Python
python无序链表删除重复项的方法
2020/01/17 Python
基于python实现matlab filter函数过程详解
2020/06/08 Python
基于python实现可视化生成二维码工具
2020/07/08 Python
Roots加拿大官网:加拿大休闲服饰品牌
2016/10/24 全球购物
英国婴儿及儿童产品商店:TigerParrot
2019/03/04 全球购物
俄罗斯连接商品和买家的在线平台:goods.ru
2020/11/30 全球购物
C#里面如何判断一个Object是否是某种类型(如Boolean)?
2016/02/10 面试题
如何写一个自定义标签
2012/12/28 面试题
升职自荐信范文
2013/10/05 职场文书
护理见习报告范文
2014/11/03 职场文书
2015年世界无烟日活动总结
2015/02/10 职场文书
初中美术教学反思
2016/02/17 职场文书
JavaScript 原型与原型链详情
2021/11/02 Javascript
Python 避免字典和元组的多重嵌套问题
2022/07/15 Python