博客
关于我
Pytorch实践--eval 模式,每次预测相同的数据得到的概率不同
阅读量:789 次
发布时间:2019-03-25

本文共 831 字,大约阅读时间需要 2 分钟。

在使用PyTorch训练好的模型进行预测时,可能会遇到一个问题,此问题出现在模型被设置为评估模式(eval())后。具体来说,同一数据在每次预测时,概率值会出现变化。这种情况下,许多技术人员可能会感到困惑,不知道为什么相同数据的预测结果会截然不同。

分析与原因

使用eval()模式会将模型切换为评估模式,此时模型的Dropout和BatchNorm层(如果有的话)会生效。但需要注意的是,这些层必须包含在模块(_modules)中。只有当类成员的type派生于Module时,该成员才会被自动划归到_modules中。如果在设计网络时,某些包含Dropout或BatchNorm的层不被包含在模块中,那么在评估模式下,这些层将无法正常工作。

查看源码发现

通过检查模型的源码,可以发现以下情况:某些成员函数使用了nn.Dropout,尽管它应该属于模块。但是,由于某些原因,这个Dropout层不属于_modules,这就导致在评估模式下,Dropout层无法正常工作。这个问题导致每次对同一数据进行预测时,Dropout层的随机采样结果不同,从而造成概率值的变化。

解决方案

要解决此类问题,模型开发者需要确保在网络设计阶段,所有使用Dropout或BatchNorm的层都包含在模块(_modules)中。这样,在评估模式下,这些层才能正常工作。这是确保模型在评估模式下表现稳定和可靠的关键步骤。

建议开发人员在构建网络时,仔细检查每个使用Dropout或BatchNorm的层是否被正确地包含在模块中。如果某个特定的层不在模块中,应将该层所属的父容器或者整体网络结构进行检查,并确保它们被正确划归到模块中。如果在代码中没有明确地将这些层包含在模块中,可能需要手动调整模型的结构,使其符合PyTorch的模块化管理方式。

通过以上措施,可以确保模型在评估模式下,其Dropout和BatchNorm层能够正常工作,从而使得模型预测结果具有稳定性和可测量性。

转载地址:http://jjxuk.baihongyu.com/

你可能感兴趣的文章
mysql server has gone away
查看>>
mysql slave 停了_slave 停止。求解决方法
查看>>
MySQL SQL 优化指南:主键、ORDER BY、GROUP BY 和 UPDATE 优化详解
查看>>
MYSQL sql语句针对数据记录时间范围查询的效率对比
查看>>
mysql sum 没返回,如果没有找到任何值,我如何在MySQL中获得SUM函数以返回'0'?
查看>>
mysql Timestamp时间隔了8小时
查看>>
Mysql tinyint(1)与tinyint(4)的区别
查看>>
mysql union orderby 无效
查看>>
mysql v$session_Oracle 进程查看v$session
查看>>
mysql where中如何判断不为空
查看>>
MySQL Workbench 使用手册:从入门到精通
查看>>
mysql workbench6.3.5_MySQL Workbench
查看>>
MySQL Workbench安装教程以及菜单汉化
查看>>
MySQL Xtrabackup 安装、备份、恢复
查看>>
mysql [Err] 1436 - Thread stack overrun: 129464 bytes used of a 286720 byte stack, and 160000 bytes
查看>>
MySQL _ MySQL常用操作
查看>>
MySQL – 导出数据成csv
查看>>
MySQL —— 在CentOS9下安装MySQL
查看>>
MySQL —— 视图
查看>>
mysql 不区分大小写
查看>>