主页 > 知识库 > 解决Pytorch中的神坑:关于model.eval的问题

解决Pytorch中的神坑:关于model.eval的问题

热门标签:企业做大做强 语音系统 Win7旗舰版 呼叫中心市场需求 客户服务 硅谷的囚徒呼叫中心 百度AI接口 电话运营中心

有时候使用Pytorch训练完模型,在测试数据上面得到的结果令人大跌眼镜。

这个时候需要检查一下定义的Model类中有没有 BN 或 Dropout 层,如果有任何一个存在

那么在测试之前需要加入一行代码:

#model是实例化的模型对象
model = model.eval()

表示将模型转变为evaluation(测试)模式,这样就可以排除BN和Dropout对测试的干扰。

因为BN和Dropout在训练和测试时是不同的:

对于BN,训练时通常采用mini-batch,所以每一批中的mean和std大致是相同的;而测试阶段往往是单个图像的输入,不存在mini-batch的概念。所以将model改为eval模式后,BN的参数固定,并采用之前训练好的全局的mean和std;

对于Dropout,训练阶段,隐含层神经元先乘概率P,再进行激活;而测试阶段,神经元先激活,每个隐含层神经元的输出再乘概率P。

如下图所示:

补充:pytorch中model.eval之后是否还需要model.train的问题

答案是:需要的

正确的写法是

for循环之后再开启train,

循环之后的评估model.eval之后就会再次回到model.train

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
  • 聊聊pytorch测试的时候为何要加上model.eval()
  • pytorch:model.train和model.eval用法及区别详解
  • 解决BN和Dropout共同使用时会出现的问题

标签:山西 海南 安康 喀什 济南 山西 崇左 长沙

巨人网络通讯声明:本文标题《解决Pytorch中的神坑:关于model.eval的问题》,本文关键词  ;如发现本文内容存在版权问题,烦请提供相关信息告之我们,我们将及时沟通与处理。本站内容系统采集于网络,涉及言论、版权与本站无关。
  • 相关文章
  • 收缩
    • 微信客服
    • 微信二维码
    • 电话咨询

    • 400-1100-266