聊聊pytorch测试的时候为何要加上model.eval()


Posted in Python onMay 23, 2021

Do need to use model.eval() when I test?

Sure, Dropout works as a regularization for preventing overfitting during training.

It randomly zeros the elements of inputs in Dropout layer on forward call.

It should be disabled during testing since you may want to use full model (no element is masked)

使用PyTorch进行训练和测试时一定注意要把实例化的model指定train/eval,eval()时,框架会自动把BN和DropOut固定住,不会取平均,而是用训练好的值,不然的话,一旦test的batch_size过小,很容易就会被BN层导致生成图片颜色失真极大!!!!!!

补充:pytorch中model eval和torch no grad()的区别

model.eval()和with torch.no_grad()的区别

在PyTorch中进行validation时,会使用model.eval()切换到测试模式,在该模式下,

主要用于通知dropout层和batchnorm层在train和val模式间切换

在train模式下,dropout网络层会按照设定的参数p设置保留激活单元的概率(保留概率=p); batchnorm层会继续计算数据的mean和var等参数并更新。

在val模式下,dropout层会让所有的激活单元都通过,而batchnorm层会停止计算和更新mean和var,直接使用在训练阶段已经学出的mean和var值。

该模式不会影响各层的gradient计算行为,即gradient计算和存储与training模式一样,只是不进行反传(backprobagation)

而with torch.no_grad()则主要是用于停止autograd模块的工作,以起到加速和节省显存的作用,具体行为就是停止gradient计算,从而节省了GPU算力和显存,但是并不会影响dropout和batchnorm层的行为。

使用场景

如果不在意显存大小和计算时间的话,仅仅使用model.eval()已足够得到正确的validation的结果;而with torch.zero_grad()则是更进一步加速和节省gpu空间(因为不用计算和存储gradient),从而可以更快计算,也可以跑更大的batch来测试。

补充:Pytorch的modle.train,model.eval,with torch.no_grad的个人理解

1. 最近在学习pytorch过程中遇到了几个问题

不理解为什么在训练和测试函数中model.eval(),和model.train()的区别,经查阅后做如下整理

一般情况下,我们训练过程如下:

1、拿到数据后进行训练,在训练过程中,使用

model.train():告诉我们的网络,这个阶段是用来训练的,可以更新参数。

2、训练完成后进行预测,在预测过程中,使用

model.eval() : 告诉我们的网络,这个阶段是用来测试的,于是模型的参数在该阶段不进行更新。

2. 但是为什么在eval()阶段会使用with torch.no_grad()?

查阅相关资料:传送门

with torch.no_grad - disables tracking of gradients in autograd.

model.eval() changes the forward() behaviour of the module it is called upon

eg, it disables dropout and has batch norm use the entire population statistics

总结一下就是说,在eval阶段了,即使不更新,但是在模型中所使用的dropout或者batch norm也就失效了,直接都会进行预测,而使用no_grad则设置让梯度Autograd设置为False(因为在训练中我们默认是True),这样保证了反向过程为纯粹的测试,而不变参数。

另外,参考文档说这样避免每一个参数都要设置,解放了GPU底层的时间开销,在测试阶段统一梯度设置为False

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python判断操作系统类型代码分享
Nov 22 Python
python返回昨天日期的方法
May 13 Python
python爬虫之BeautifulSoup 使用select方法详解
Oct 23 Python
Python快速查找list中相同部分的方法
Jun 27 Python
Python实现繁?转为简体的方法示例
Dec 18 Python
Python使用Shelve保存对象方法总结
Jan 28 Python
Python3 requests文件下载 期间显示文件信息和下载进度代码实例
Aug 16 Python
python3.6、opencv安装环境搭建过程(图文教程)
Nov 05 Python
python 实现一个反向单位矩阵示例
Nov 29 Python
Python+Appium实现自动化测试的使用步骤
Mar 24 Python
重构Python代码的六个实例
Nov 25 Python
Python新建项目自动添加介绍和utf-8编码的方法
Dec 26 Python
PyTorch 如何自动计算梯度
May 23 #Python
解决numpy和torch数据类型转化的问题
May 23 #Python
Python 用户输入和while循环的操作
May 23 #Python
解决Tkinter中button按钮未按却主动执行command函数的问题
May 23 #Python
python tkinter Entry控件的焦点移动操作
May 22 #Python
python3.7.2 tkinter entry框限定输入数字的操作
May 22 #Python
tensorboard 可视化之localhost:6006不显示的解决方案
You might like
用PHP实现文件上传二法
2006/10/09 PHP
ThinkPHP利用PHPMailer实现邮件发送实现代码
2013/09/26 PHP
php实现word转html的方法
2016/01/22 PHP
PHP SPL 被遗落的宝石【SPL应用浅析】
2018/04/20 PHP
Yii框架参数配置文件params用法实例分析
2019/09/11 PHP
漂亮的widgets,支持换肤和后期开发新皮肤(2007-4-27已更新1.7alpha)
2007/04/27 Javascript
IE和FireFox(FF)中js和css的不同
2009/04/13 Javascript
基于jQuery的动态增删改查表格信息,可左键/右键提示(原创自Zjmainstay)
2012/07/31 Javascript
js获取height和width的方法说明
2013/01/06 Javascript
JS保存、读取、换行、转Json报错处理方法
2013/06/14 Javascript
使用jQuery解决IE与FireFox下createElement方法的差异
2013/11/14 Javascript
JS控件ASP.NET的treeview控件全选或者取消(示例代码)
2013/12/16 Javascript
在React框架中实现一些AngularJS中ng指令的例子
2016/03/06 Javascript
快速掌握Node.js模块封装及使用
2016/03/21 Javascript
基于js对象,操作属性、方法详解
2016/08/11 Javascript
微信小程序实现即时通信聊天功能的实例代码
2018/08/17 Javascript
vue实现的树形结构加多选框示例
2019/02/02 Javascript
vue props 一次传多个值实例
2020/07/22 Javascript
Python按行读取文件的实现方法【小文件和大文件读取】
2016/09/19 Python
Python WXPY实现微信监控报警功能的代码
2017/10/20 Python
Python实现的txt文件去重功能示例
2018/07/07 Python
python 求某条线上特定x值或y值的点坐标方法
2019/07/09 Python
python使用yield压平嵌套字典的超简单方法
2019/11/02 Python
全网首秀之Pycharm十大实用技巧(推荐)
2020/04/27 Python
Python与C/C++的相互调用案例
2021/03/04 Python
css3编写浏览器背景渐变背景色的方法
2018/03/05 HTML / CSS
EJB需直接实现它的业务接口或Home接口吗,请简述理由
2016/11/23 面试题
咨询公司各岗位职责
2013/12/02 职场文书
工伤赔偿协议书范本
2014/04/15 职场文书
四风批评与自我批评范文
2014/10/14 职场文书
致青春观后感
2015/06/09 职场文书
学术会议领导致辞
2015/07/29 职场文书
2016入党积极分子考察评语
2015/12/01 职场文书
初中美术教学反思
2016/02/17 职场文书
Nginx中break与last的区别详析
2021/03/31 Servers
据Python爬虫不靠谱预测可知今年双十一销售额将超过6000亿元
2021/11/11 Python