跳到主内容
快讯直播
AI智模界
AI 词典

训练模式与推理模式:忘了 eval(),同一输入结果会漂

一句话定义:训练模式(Train Mode)和推理模式(Eval / AI 词典:Inference">Inference Mode)是深度学习框架为模型设置的两种运行状态开关。model.train() 让模型进入“学习”状态,model.eval() 让它进入“使用”状态。参数本身不变,但部分层的行为会变。

为什么需要两个模式

有些层在“排练”和“正式演出”时的行为本就该不同。

以 Dropout 为例:训练时它按概率随机把一部分神经元的输出置零,强迫网络不依赖某几个固定神经元,从而抑制过拟合。这就像排练时故意随机换人上场。但正式演出不能这么干:如果推理时还随机丢弃,同一个输入跑两次会得到两个不同答案,而且输出整体会偏小。

再看 批归一化(Batch Normalization, BN):训练时它用“当前这一批数据”的均值和方差做归一化,同时把历史统计量累积到 running_mean / running_var 里。推理时没有“训练批次”这个概念了,必须改用积累下来的历史统计量。否则,同一张图片单独预测和放进不同批次里预测,结果会不一样——因为批次里其他人的数据影响了它的归一化。

两种模式的对比

组件训练模式 train()推理模式 eval()
Dropout按概率随机置零完全关闭,全部神经元参与
BatchNorm用当前 batch 统计量,并更新 running 统计用 running 统计量,不再更新
梯度计算默认记录默认仍记录,需配合 torch.no_grad() 才省显存
参数会被优化器更新不会被更新(除非你手动改)

容易混淆的相邻概念

  • model.eval() 与 torch.no_grad() 是两件事:前者改变层的行为,后者只关掉梯度记录以省内存。做推理时通常两个都要,但谁也替代不了谁。
  • model.eval() 不等于冻结参数,它只是切换状态;要冻结得另外设置 requires_grad。
  • 把 Dropout 的概率设成 0 也不等价于 eval 模式,BN 的行为依然不同。

对从业者的实际意义

最常见的坑是:训练脚本跑完,直接拿模型去做验证或上线,忘了切 eval()。症状很有迷惑性——指标在小数点后抖动、同样的请求两次返回不同答案、线下复现不出线上结果。排查时优先检查这一点。

实践上的两条纪律:一是在验证、测试、导出、部署前,显式调用一次 eval();二是在训练循环里,验证结束后记得切回 train(),否则后续训练相当于悄悄关掉了正则化。不同框架的具体 API 与默认行为略有差异,以官方文档为准。

AI 生成本文由 AI 基于公开信息自动生成,仅供参考。