聊聊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之重回函数
Oct 10 Python
Python中optparse模块使用浅析
Jan 01 Python
Python面向对象编程中的类和对象学习教程
Mar 30 Python
Python实现数据库编程方法详解
Jun 09 Python
Python3字符串学习教程
Aug 20 Python
Django框架自定义session处理操作示例
May 27 Python
python导包的几种方法(自定义包的生成以及导入详解)
Jul 15 Python
python实现滑雪游戏
Feb 22 Python
PyCharm 2020 激活到 2100 年的教程
Mar 25 Python
Python3操作读写CSV文件使用包过程解析
Apr 10 Python
Python+unittest+requests+excel实现接口自动化测试框架
Dec 23 Python
Python接口自动化之文件上传/下载接口详解
Apr 05 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
一次编写,随处运行
2006/10/09 PHP
ThinkPHP CURD方法之field方法详解
2014/06/18 PHP
php操作mongodb封装类与用法实例
2018/09/01 PHP
js 实现日期灵活格式化的小例子
2013/07/14 Javascript
取消选中单选框radio的三种方式示例介绍
2013/12/23 Javascript
js实现表格字段排序
2014/02/19 Javascript
JavaScript拆分字符串时产生空字符的解决方案
2014/09/26 Javascript
js ajaxfileupload.js上传报错的解决方法
2016/05/05 Javascript
Angularjs过滤器使用详解
2016/05/25 Javascript
动态更新highcharts数据的实现方法
2016/05/28 Javascript
移动端H5开发 Turn.js实现很棒的翻书效果
2016/06/20 Javascript
bootstrap日历插件datetimepicker使用方法
2016/12/14 Javascript
jquery与ajax获取特殊字符实例详解
2017/01/08 Javascript
NodeJs测试框架Mocha的安装与使用
2017/03/28 NodeJs
ES6新特性八:async函数用法实例详解
2017/04/21 Javascript
JavaScript仿微信(电话)联系人列表滑动字母索引实例讲解(推荐)
2017/08/16 Javascript
利用VS Code开发你的第一个AngularJS 2应用程序
2017/12/15 Javascript
JS封装的模仿qq右下角消息弹窗功能示例
2018/08/22 Javascript
JS实现简单打字测试
2020/06/24 Javascript
[01:28:56]2014 DOTA2华西杯精英邀请赛 5 24 CIS VS DK
2014/05/26 DOTA
Python实现的生成自我描述脚本分享(很有意思的程序)
2014/07/18 Python
在Python中使用swapCase()方法转换大小写的教程
2015/05/20 Python
剖析Python的Tornado框架中session支持的实现代码
2015/08/21 Python
Python聊天室实例程序分享
2016/01/05 Python
JPype实现在python中调用JAVA的实例
2017/07/19 Python
Python中getpass模块无回显输入源码解析
2018/01/11 Python
Python温度转换实例分析
2018/01/17 Python
Python实现两个list求交集,并集,差集的方法示例
2018/08/02 Python
使用OpenCV实现仿射变换—旋转功能
2019/08/29 Python
Django生成PDF文档显示网页上以及PDF中文显示乱码的解决方法
2019/12/17 Python
html5写一个BUI折叠菜单插件的实现方法
2019/09/11 HTML / CSS
Made in Design德国:设计师家具、灯具和装饰
2019/10/31 全球购物
若干个Java基础面试题
2015/05/19 面试题
会计电算化个人求职信范文
2014/01/24 职场文书
2019年大学生暑期社会实践调查报告模板
2019/11/07 职场文书
《我的美好婚事》动画化决定纪念插画与先导PV公开
2022/04/06 日漫