聊聊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改变日志(logging)存放位置的示例
Mar 27 Python
编写Python脚本来获取mp3文件tag信息的教程
May 04 Python
Python中列表和元组的使用方法和区别详解
Dec 30 Python
分享6个隐藏的python功能
Dec 07 Python
Python基于FTP模块实现ftp文件上传操作示例
Apr 23 Python
python3.6.3转化为win-exe文件发布的方法
Oct 31 Python
Python3非对称加密算法RSA实例详解
Dec 06 Python
Python使用sax模块解析XML文件示例
Apr 04 Python
解决Jupyter notebook中.py与.ipynb文件的import问题
Apr 21 Python
python3 循环读取excel文件并写入json操作
Jul 14 Python
pycharm 配置svn的图文教程(手把手教你)
Jan 15 Python
Python中X[:,0]和X[:,1]的用法
May 10 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
模仿OSO的论坛(二)
2006/10/09 PHP
php面向对象全攻略 (十七) 自动加载类
2009/09/30 PHP
PHP处理Json字符串解码返回NULL的解决方法
2014/09/01 PHP
用Javascript 和 CSS 实现脚注(Footnote)效果
2009/09/09 Javascript
学习ExtJS fit布局使用说明
2009/10/08 Javascript
JS中的异常处理方法分享
2013/12/22 Javascript
Javascript单元测试框架QUnitjs详细介绍
2014/05/08 Javascript
基于jQuery实现select下拉选择可输入附源码下载
2016/02/03 Javascript
JS操作COOKIE实现备忘记录的方法
2016/04/01 Javascript
使用JSON作为函数的参数的优缺点
2016/10/27 Javascript
jquery实现左右滑动式轮播图
2017/03/02 Javascript
在vue-cli中组件通信的方法
2017/12/16 Javascript
layui-laydate时间日历控件使用方法详解
2018/11/15 Javascript
turn.js异步加载实现翻书效果
2019/07/25 Javascript
解决vue动态路由异步加载import组件,加载不到module的问题
2020/07/26 Javascript
Echarts.js无法引入问题解决方案
2020/10/30 Javascript
JavaScript枚举选择jquery插件代码实例
2020/11/17 jQuery
python计数排序和基数排序算法实例
2014/04/25 Python
python win32 简单操作方法
2017/05/25 Python
利用Python读取txt文档的方法讲解
2018/06/23 Python
pycharm配置pyqt5-tools开发环境的方法步骤
2019/02/11 Python
Python线上环境使用日志的及配置文件
2019/07/28 Python
Django继承自带user表并重写的例子
2019/11/18 Python
TensorFlow内存管理bfc算法实例
2020/02/03 Python
Python创建空列表的字典2种方法详解
2020/02/13 Python
Python matplotlib读取excel数据并用for循环画多个子图subplot操作
2020/07/14 Python
捷克玩具商店:Bambule
2019/02/23 全球购物
什么是命名空间(NameSpace)
2015/11/24 面试题
电气工程及其自动化学生实习自我鉴定
2013/09/19 职场文书
自主招生自荐信指南
2014/02/04 职场文书
读书之星事迹材料
2014/05/12 职场文书
校园学雷锋广播稿
2014/10/08 职场文书
2014年班组工作总结
2014/11/20 职场文书
MySQL中distinct和count(*)的使用方法比较
2021/05/26 MySQL
Win10防火墙白名单怎么设置?Win10添加防火墙白名单方法
2022/04/06 数码科技
vue postcss-px2rem 自适应布局
2022/05/15 Vue.js