位置: IT常识 - 正文

关于Pytorch中的train()和eval()(以及no_grad())(pytorch train())

编辑:rootadmin
关于Pytorch中的train()和eval()(以及no_grad()) 1、三剑客:train()、eval()、no_grad()1.1 train()1.2 eval()1.3 no_grad()2、简单分析下2.1 为什么要使用train()和eval()2.2 为什么可以把训练集的统计量用作测试集?3、我的坑

推荐整理分享关于Pytorch中的train()和eval()(以及no_grad())(pytorch train()),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:pytorch trace,pytorch tqdm,pytorch trace,pytorch jit trace,pytorch trace,pytorch tqdm,pytorch tqdm,pytorch trace,内容如对您有帮助,希望把文章链接给更多的朋友!

起源是我训练好了一个模型,新建一个推理脚本加载好checkpoint和预处理输入后推理,发现无论输入是哪一类甚至是随机数,其输出概率总是第一类的值最大,且总是在0.5附近,排查许久,发现是没有加上model.eval()函数。

因为我使用了model.no_grad(),下意识认为不需要加model.eval(),导致发生了本次事故

1、三剑客:train()、eval()、no_grad()

这三个函数实际上很常见,先来简单看下使用方法

1.1 train()

train()是nn.Module的方法,也就是你定义了一个网络model,那么mdoel.train()表示将该model设置为训练模式,一般在开始新epoch训练时,我们会首先执行该命令:

...model.train()# 将模型设置为训练模式for i, data in enumerate(train_loader): # 开始新epoch的训练images, labels = data images, labels = images.to(device), labels.to(device)...

1.2 eval()

同train()一样,其用法和含义也一样,eval()是nn.Module的方法,也就是你定义了一个网络model,那么mdoel.eval()表示将该model设置为验证模式,一般在开始验证当前model效果时,我们会首先执行该命令:

...model.eval()# 将模型设置为验证模式for i, data in enumerate(eval_loader): # 在验证集上验证images, labels = data images, labels = images.to(device), labels.to(device)...

1.3 no_grad()

no_grad()是torch库的方法,和上下文管理器with来搭配使用。 其作用是禁用梯度计算,当你确定不会调用tensor.backward()时。它将减少计算的内存消耗,否则这些计算将requires_grad=True。 如果设定了no_grad(),即使输入张量属性requires_grad为True,也不会计算梯度

一般我们进行模型验证或者模型推理时,就不需要梯度以及反向传播,所以我们可以在torch.no_grad()上下文管理器中执行我们的验证或推理任务,可以显著降低显存的使用。

with torch.no_grad():output=model(input_tensor)# 模型推理print(output) # model推理才涉及梯度等,print都不涉及了,所以在不在with之中已经无所谓了2、简单分析下2.1 为什么要使用train()和eval()

我们知道nn.Module中的BN层可以加速收敛,但是该层需要计算输入BatchTensor的均值和方差,毕竟一个BatchSize为64、128甚至更大,计算他们的均值和方差也简单。

关于Pytorch中的train()和eval()(以及no_grad())(pytorch train())

但问题是,当我们推理时,去对一张图像进行推理时,计算到BN层也需要该批次的均值和方差。但是现在就一个tensor,计算其均值和方差是没有意义的(一个样本的均值和方差统计量说明不了什么)。

实际上在推理时BN所需要的均值和方差是训练时的值(可以理解为训练时把训练样本的均值和方差记录下来了)。

问题来了,模型怎么知道我现在是训练状态还是推理状态?

当model.train()时,模型处于训练状态,模型会计算Batch的均值和方差

当model.eval()时,模型处于验证状态,模型会使用训练集的均值和方差作为验证数据的均值和方差

同样的还有Dropout层,Dropout层在训练时会随机失活某些神经元,提高模型泛化能力,但是在验证推理时,Dropout层不需要再失活了,也就是所有的神经元都要“干活”了。

总之train()和eval()最主要就是影响了BN层和Dropout层

2.2 为什么可以把训练集的统计量用作测试集?

为什么可以把训练集的统计量用作测试集,因为无论是训练集、验证集还是测试机,甚至是没有收集到的同类图像,他们都是独立同分布的。

换句话说,世界上所有的猫的图片组成一个集合,那么这个集合就存在一个分布,这个分布就像高斯分布、泊松分布等,只不过这个猫的集合分布可能更加复杂,暂叫它猫分布吧。

这个猫分布中每一个样本都肯定是服从这个猫分布的,但同时这些样本互不相关联,我们把其中一部分拿来做训练集,再拿一小部分做测试集。

我们设计了一个模型在训练集上训练,因为训练集也服从猫分布,所以模型在训练集上“锻炼”出来的能力,就是从小块训练集去拟合整个猫分布。

即从少量猫图上去推理所有猫图,从而具有泛化能力,去推理没有见过的但同类的图像也有非常好的效果。但是这也容易造成管中窥豹,只看到事物的一部分,见不全面,所以模型又无法识别出所有的猫图。

3、我的坑

我下意识以为使用了no_grad()就不需要再设置了eval(),导致训练效果很好,自己以测试,其输出的概率毫无逻辑。

eval()是影响BN层和Dropout层 而no_grad()是不计算梯度 两个是风马牛不相及,当然搭配使用效果即好还剩内存!

本文链接地址:https://www.jiuchutong.com/zhishi/295386.html 转载请保留说明!

上一篇:面试官问出这几道算法题,你能扛住么?(面试官问几个问题)

下一篇:微信小程序【获取用户昵称头像和昵称(附源码)】(微信小程序获取位置信息的权限在哪里修改位置)

  • 笔记本怎么连接隐藏无线网络wifi(笔记本怎么连接打印机设备)

    笔记本怎么连接隐藏无线网络wifi(笔记本怎么连接打印机设备)

  • 抖音主页访客关闭后别人能看到吗(抖音主页访客关闭对方还会看到吗)

    抖音主页访客关闭后别人能看到吗(抖音主页访客关闭对方还会看到吗)

  • 微信聊天记录可以发送给别人吗(微信聊天记录可以在另外一个手机上恢复吗)

    微信聊天记录可以发送给别人吗(微信聊天记录可以在另外一个手机上恢复吗)

  • 语音怎么转发给别人(语音转发怎么转发微信)

    语音怎么转发给别人(语音转发怎么转发微信)

  • 闲鱼可以改地址吗(闲鱼改地址转寄是真的吗)

    闲鱼可以改地址吗(闲鱼改地址转寄是真的吗)

  • qq一共有多少个字符(qq一共有多少个普通字符)

    qq一共有多少个字符(qq一共有多少个普通字符)

  • 钉钉为什么扫不了健康码(钉钉为什么扫不了人脸)

    钉钉为什么扫不了健康码(钉钉为什么扫不了人脸)

  • 华为怎么开通畅连通话(华为怎么开通畅连通话功能)

    华为怎么开通畅连通话(华为怎么开通畅连通话功能)

  • 电脑微信截图无法退出(电脑微信截图无法完成)

    电脑微信截图无法退出(电脑微信截图无法完成)

  • 余额怎么转不了余额宝(余额怎么转不了网商银行不需要手续费)

    余额怎么转不了余额宝(余额怎么转不了网商银行不需要手续费)

  • 微信封号几次永久封号(微信封号有几次机会)

    微信封号几次永久封号(微信封号有几次机会)

  • 坚果pro3后置摄像头多少万像素(坚果pro3背面摄像头镜片碎了)

    坚果pro3后置摄像头多少万像素(坚果pro3背面摄像头镜片碎了)

  • 抖音上能看到谁看过我吗(抖音上能看到谁浏览过我的视频吗)

    抖音上能看到谁看过我吗(抖音上能看到谁浏览过我的视频吗)

  • 手机聊天记录删了电脑还有吗(手机聊天记录删除了怎么恢复)

    手机聊天记录删了电脑还有吗(手机聊天记录删除了怎么恢复)

  • line收不到手机验证码(手机收不到line的验证短信)

    line收不到手机验证码(手机收不到line的验证短信)

  • 0pp0r17怎样投屏(oppor17手机投射屏幕教程)

    0pp0r17怎样投屏(oppor17手机投射屏幕教程)

  • 华为nova5pro解锁方式(华为nova5Pro解锁屏幕)

    华为nova5pro解锁方式(华为nova5Pro解锁屏幕)

  • 微信好友删除能申述吗(微信好友删除能看到朋友圈吗)

    微信好友删除能申述吗(微信好友删除能看到朋友圈吗)

  • 华为手机怎么截取长图(华为手机怎么截图长屏幕截图)

    华为手机怎么截取长图(华为手机怎么截图长屏幕截图)

  • Jquery 选择兄弟节点(jquery 兄弟选择器)

    Jquery 选择兄弟节点(jquery 兄弟选择器)

  • MySQL自增ID用完了怎么办?4种解决方案!(面试官问:mysql 的自增 id 用完了,怎么办?)

    MySQL自增ID用完了怎么办?4种解决方案!(面试官问:mysql 的自增 id 用完了,怎么办?)

  • 产权转让印花税计税依据
  • 会议服务费免税吗
  • 生产企业的基础设施是指
  • 经营利润和营业利润的区别
  • 收客户款现金折让发票怎么处理
  • 未预缴开票
  • 税务退进项税会计处理
  • 建筑工程公司涉及的会计科目
  • 网银 密码器
  • 产品成本核算的一般程序
  • 电子承兑必须对账吗
  • 装修改造增值税税率
  • 运费抵扣增值税是什么意思
  • 个人技术转让所得需要交税吗
  • 增值税发票如何红冲
  • 小微企业免征增值税条件
  • 高新技术企业认定管理办法
  • 空调折旧年限的最新规定2018
  • 金银首饰零售消费税税收优惠
  • 库存成本与实际成本不符
  • 维修设备领用材料会计分录怎么写
  • 房地产开发资质查询
  • 出口退免税的基本政策包括
  • 固定资产增值税税率
  • 筹建期间费用计什么科目
  • 2020年前端面试
  • php 生成缩略图
  • 银行存款利息是按月结还是按年
  • 企业购厂房会计分录
  • 不能报销的发票可以丢掉吗
  • 前端段落空两格怎么设置
  • yolov5超参数进化
  • YII Framework的filter过滤器用法分析
  • 劳务报酬已扣税是否需报个税
  • 治疗孩子咳嗽小秘方,超实用
  • 发票开错需要让客户寄回来吗
  • 在建工程业务核算
  • 购置固定资产支付的现金属于投资活动产生的现金流量吗
  • 预缴增值税所需成本
  • 税务法是否允许私人经营
  • 帝国cms使用手册
  • mysql 子查询
  • 园林绿化工程公司简介
  • 怎么查企业历史
  • 个体定额和不定额有什么区别
  • 小微企业税款征收方式
  • 没有发票的公账报销了怎么入账
  • 免征文化事业建设费条件的销售额标准
  • 汇兑损益应计入
  • 企业所得税计提的准备金可以扣除吗
  • 工业企业制造费用具体怎么摊
  • 平行结转分步法各步骤的费用
  • 银行汇票计入什么会计科目
  • 现金日记账谁负责
  • 企业应收账款的规模受哪些因素的影响?( )
  • 酒店营业额成本比例
  • 建立备查账的是
  • sql server real
  • 同一个sql语句 连接两个数据库服务器
  • mysql的主从复制模式
  • IIS7在Windows Server 2008R2的新改进
  • linux i
  • linux多线程并发的处理方式
  • gho文件硬盘安装
  • window xp电脑连接宽带怎么连接
  • camrec是什么文件
  • mac如何快速复制文件
  • linux防火墙命令大全
  • windows推送
  • Olehelp.exe - Olehelp是什么进程 有什么用
  • windows 10 正式版
  • python面向对象特征
  • js实现时间
  • json基本语法
  • 使用express
  • install ubuntu kylin
  • Qt for Android - ANT_HOME is set incorrectly or ant could not be located
  • 点击电子税务局里的税务数字账户不跳转怎么回事
  • 苏州税务实名认证流程小程序
  • 鲨鱼记账咋记账
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设