博客
关于我
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/

你可能感兴趣的文章
Postgres 自定义函数内实现 in 操作符的递归查询
查看>>
Postgres 返回当前时间前后指定天数的集合
查看>>
postgres--vacuum
查看>>
postgres--wal
查看>>
postgres--流复制
查看>>
postgres10配置huge_pages
查看>>
PostgreSQL 10.0 preview 变化 - pg_xlog,pg_clog,pg_log目录更名为pg_wal,pg_xact,log
查看>>
PostgreSQL 10.1 手册_部分 II. SQL 语言_第 15章 并行查询_15.2. 何时会用到并行查询?...
查看>>
PostgreSQL 10.1 手册_部分 II. SQL 语言_第 9 章 函数和操作符_9.23. 行和数组比较
查看>>
PostgreSQL 10.1 手册_部分 III. 服务器管理_第 21 章 数据库角色
查看>>
Postgresql 12.9如何配置允许远程连接
查看>>
PostgreSQL 9.6 同步多副本 与 remote_apply事务同步级别 应用场景分析
查看>>
Postgresql CopyManager 流式批量数据入库
查看>>
PostgreSQL cube 插件 - 多维空间对象
查看>>
PostgreSQL Daily Maintenance - cluster table
查看>>
PostgreSQL on Linux 最佳部署手册
查看>>
PostgreSQL Oracle 兼容性之 - pipelined
查看>>
PostgreSQL Point-In-Time Recovery (Incremental Backup)
查看>>
postgresql Streaming Replication监控与注意事项
查看>>
postgresql 不需要付费_使用数据传输在PostgreSQL执行 外部连接运算符
查看>>