聊聊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用zip函数同时遍历多个迭代器示例详解
Nov 14 Python
Python中序列的修改、散列与切片详解
Aug 27 Python
使用pandas实现csv/excel sheet互相转换的方法
Dec 10 Python
Python实现的爬取小说爬虫功能示例
Mar 30 Python
Pycharm运行加载文本出现错误的解决方法
Jun 27 Python
使用python制作游戏下载进度条的代码(程序说明见注释)
Oct 24 Python
python关于调用函数外的变量实例
Dec 26 Python
快速解决jupyter notebook启动需要密码的问题
Apr 21 Python
keras:model.compile损失函数的用法
Jul 01 Python
pandas按照列的值排序(某一列或者多列)
Dec 13 Python
Python之基础函数案例详解
Aug 30 Python
Python数据处理的三个实用技巧分享
Apr 01 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程序漏洞产生的原因分析与防范方法说明
2014/03/06 PHP
Yii Framework框架获取分类下面的所有子类方法
2014/06/20 PHP
PHP中使用addslashes函数转义的安全性原理分析
2014/11/03 PHP
thinkPHP使用post方式查询时分页失效的解决方法
2015/12/09 PHP
jquery、js操作checkbox全选反选
2014/03/12 Javascript
浅谈JavaScript事件的属性列表
2015/03/01 Javascript
JS+CSS实现TreeMenu二级树形菜单完整实例
2015/09/18 Javascript
AngularJS中实现显示或隐藏动画效果的方式总结
2015/12/31 Javascript
Bootstrap BootstrapDialog使用详解
2017/02/17 Javascript
微信小程序商城项目之淘宝分类入口(2)
2017/04/17 Javascript
Vue之Watcher源码解析(2)
2017/07/19 Javascript
JS逻辑运算符短路操作实例分析
2018/07/09 Javascript
详解微信小程序支付流程与梳理
2019/07/16 Javascript
Openlayers绘制地图标注
2020/09/28 Javascript
Vue仿Bibibili首页的问题
2021/01/21 Vue.js
[00:12]2018DOTA2亚洲邀请赛 Somnus丶M出阵单挑
2018/04/06 DOTA
探索Python3.4中新引入的asyncio模块
2015/04/08 Python
python中json格式数据输出的简单实现方法
2016/10/31 Python
python用户管理系统的实例讲解
2017/12/23 Python
Python基于百度AI的文字识别的示例
2018/04/21 Python
python清除字符串前后空格函数的方法
2018/10/21 Python
在python中使用requests 模拟浏览器发送请求数据的方法
2018/12/26 Python
对python实现二维函数高次拟合的示例详解
2018/12/29 Python
python3.x实现base64加密和解密
2019/03/28 Python
Django框架中间件(Middleware)用法实例分析
2019/05/24 Python
Python替换月份为英文缩写的实现方法
2019/07/15 Python
python脚本调用iftop 统计业务应用流量的思路详解
2019/10/11 Python
Canvas波浪花环的示例代码
2020/08/21 HTML / CSS
澳大利亚先进的皮肤和激光诊所购物网站:Soho Skincare
2018/10/15 全球购物
Koral官方网站:女性时尚运动服
2019/04/10 全球购物
施工班组长岗位职责
2014/01/05 职场文书
承兑汇票延期证明
2015/06/23 职场文书
开学第一周日记(三篇范文)
2019/08/23 职场文书
五年级作文之学校的四季
2019/12/05 职场文书
uniapp开发小程序的经验总结
2021/04/08 Javascript
CSS list-style-type属性使用方法
2023/05/21 HTML / CSS