聊聊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使用函数默认值实现函数静态变量的方法
Aug 18 Python
Python中unittest用法实例
Sep 25 Python
Python的Django框架中forms表单类的使用方法详解
Jun 21 Python
Python按行读取文件的简单实现方法
Jun 22 Python
python连接mysql实例分享
Oct 09 Python
python机器学习之随机森林(七)
Mar 26 Python
Python格式化输出字符串方法小结【%与format】
Oct 29 Python
对python中Librosa的mfcc步骤详解
Jan 09 Python
在python中将list分段并保存为array类型的方法
Jul 15 Python
在python中实现同行输入/接收多个数据的示例
Jul 20 Python
Python迭代器模块itertools使用原理解析
Dec 11 Python
教你用Python matplotlib库制作简单的动画
Jun 11 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基础知识:类与对象(2) 自动加载对象
2006/12/13 PHP
php内核解析:PHP中的哈希表
2014/01/30 PHP
php+highchats生成动态统计图
2014/05/21 PHP
PHP多维数组排序array详解
2017/11/21 PHP
php实现微信支付之企业付款
2018/05/30 PHP
让回调函数 showResponse 也带上参数的代码
2007/08/13 Javascript
javascript中为某个元素指定事件的三种方式
2014/08/07 Javascript
js生成验证码并直接在前端判断
2015/05/15 Javascript
javascript编写贪吃蛇游戏
2015/07/07 Javascript
Vue.js组件tree实现无限级树形菜单
2016/12/02 Javascript
Angular的$http与$location
2016/12/26 Javascript
JavaScript BASE64算法实现(完美解决中文乱码)
2017/01/10 Javascript
vue单页面打包文件大?首次加载慢?nginx带你飞,从7.5M到1.3M蜕变过程(推荐)
2018/01/16 Javascript
koa上传excel文件并解析的实现方法
2018/08/09 Javascript
layui实现点击按钮给table添加一行
2018/08/10 Javascript
vue 自定义指令自动获取文本框焦点的方法
2018/08/25 Javascript
d3.js实现图形缩放平移
2019/12/19 Javascript
JS如何实现网站中PC端和手机端自动识别并跳转对应的代码
2020/01/08 Javascript
原生js+ajax分页组件
2020/01/30 Javascript
Windows8下安装Python的BeautifulSoup
2015/01/22 Python
合并百度影音的离线数据( with python 2.3)
2015/08/04 Python
详解Python字符串对象的实现
2015/12/24 Python
Python控制多进程与多线程并发数总结
2016/10/26 Python
浅析python递归函数和河内塔问题
2017/04/18 Python
Python获取当前路径实现代码
2017/05/08 Python
Django admin实现图书管理系统菜鸟级教程完整实例
2017/12/12 Python
python获取文件真实链接的方法,针对于302返回码
2018/05/14 Python
python 定时器,实现每天凌晨3点执行的方法
2019/02/20 Python
基于Python脚本实现邮件报警功能
2020/05/20 Python
大学生学习自我评价
2014/01/13 职场文书
行政文秘岗位职责范本
2014/02/10 职场文书
体育教师求职信
2014/05/24 职场文书
2014年秋季开学典礼致辞
2014/08/02 职场文书
学生打架检讨书
2014/10/20 职场文书
工作业绩不及格检讨书
2014/10/28 职场文书
JavaScript中关于预编译、作用域链和闭包的理解
2021/03/31 Javascript