聊聊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自动化测试之setUp与tearDown实例
Sep 28 Python
python实现根据主机名字获得所有ip地址的方法
Jun 28 Python
使用Python的urllib2模块处理url和图片的技巧两则
Feb 18 Python
Python使用中文正则表达式匹配指定中文字符串的方法示例
Jan 20 Python
python生成excel的实例代码
Nov 08 Python
Python使用matplotlib简单绘图示例
Feb 01 Python
Python爬虫实例扒取2345天气预报
Mar 04 Python
django框架实现一次性上传多个文件功能示例【批量上传】
Jun 19 Python
python制作英语翻译小工具代码实例
Sep 09 Python
基于Python fminunc 的替代方法
Feb 29 Python
浅析Django 接收所有文件,前端展示文件(包括视频,文件,图片)ajax请求
Mar 09 Python
深入浅析python3 依赖倒置原则(示例代码)
Jul 09 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
星际争霸任务指南——虫族
2020/03/04 星际争霸
php microtime获取浮点的时间戳
2010/02/21 PHP
php中用foreach来操作数组的代码
2011/07/17 PHP
discuz加密解密函数使用方法和中文注释
2014/01/21 PHP
ThinkPHP3.1新特性之多数据库操作更加完善
2014/06/19 PHP
PHP将页面中点击数量高的链接进行高亮显示的方法
2016/05/30 PHP
解决在laravel中auth建立时候遇到的问题
2019/10/15 PHP
js传值 判断
2006/10/26 Javascript
JQuery入门——用映射方式绑定不同事件应用示例
2013/02/05 Javascript
减少访问DOM的次数提升javascript性能
2014/02/24 Javascript
开源的javascript项目Kissy介绍
2014/11/28 Javascript
windows8.1+iis8.5下安装node.js开发环境
2014/12/12 Javascript
vue父组件触发事件改变子组件的值的方法实例详解
2019/05/07 Javascript
JavaScript变量基本使用方法实例分析
2019/11/15 Javascript
JS Html转义和反转义(html编码和解码)的实现与使用方法总结
2020/03/10 Javascript
[32:07]完美世界DOTA2联赛PWL S3 LBZS vs Rebirth 第一场 12.16
2020/12/17 DOTA
python-opencv在有噪音的情况下提取图像的轮廓实例
2017/08/30 Python
Python中的二维数组实例(list与numpy.array)
2018/04/13 Python
python模块导入的细节详解
2018/12/10 Python
Django 路由控制的实现
2019/07/17 Python
Python将主机名转换为IP地址的方法
2019/08/14 Python
Python破解BiliBili滑块验证码的思路详解(完美避开人机识别)
2020/02/17 Python
Python unittest工作原理和使用过程解析
2020/02/24 Python
Python求两个字符串最长公共子序列代码实例
2020/03/05 Python
Python os库常用操作代码汇总
2020/11/03 Python
Python包资源下载路径报404解决方案
2020/11/05 Python
pandas使用函数批量处理数据(map、apply、applymap)
2020/11/27 Python
canvas基础之图形验证码的示例
2018/01/02 HTML / CSS
澳大利亚最受欢迎的美发和美容在线商店:Catwalk
2018/12/12 全球购物
计算机应用职专应届生求职信
2013/11/12 职场文书
公司募捐倡议书
2014/05/14 职场文书
志愿者个人总结
2015/03/03 职场文书
小学生禁毒教育心得体会
2016/01/15 职场文书
导游词之新疆尼雅遗址
2019/10/16 职场文书
python缺失值的解决方法总结
2021/06/09 Python
Django中celery的使用项目实例
2022/07/07 Python