神经网络的评估模式和训练模式
评估模式和训练模式是pytorch神经网络两种不同的模型状态。
评估模式和训练模式
训练模式:
训练模式是模型在接收训练数据并进行学习时的状态。在这种模式下,模型会根据输入数据进行前向传播,计算损失,并通过反向传播更新权重。
特点:
- 权重更新: 模型的权重会根据损失函数的梯度进行更新。
- Dropout激活: 如果模型中包含了Dropout层,这些层会在前向传播时随机将一部分神经元的输出置零,以减少过拟合。
- Batch Normalization层行为: 在训练模式下,Batch Normalization层会使用当前批次的数据来计算均值和方差,用于标准化。
使用train()
方法将神经网络模型设置为训练模式。
比如:
1 |
|
评估模式:
评估模式是模型在处理非训练数据(如验证集或测试集)时的状态。在这种模式下,模型不会更新权重,而是用于生成预测或评估性能
特点:
- 权重固定:
模型的权重不会更新,即不会进行反向传播和梯度下降。如果设置了
model.eval()
后,再使用optimizer.step()
,会报错。 - Dropout关闭: Dropout层会保留所有神经元的输出,但会乘以保留概率(1-p),以保持输出规模与训练时相同。
- Batch Normalization层行为: 在评估模式下,Batch Normalization层会使用训练过程中累积的均值和方差来进行标准化,而不是当前批次的统计数据
使用eval()
方法将神经网络模型设置为评估模式,配合with torch.no_grad()
不计算梯度
比如:
1 |
|
torch.no_grad()
torch.no_grad()
是Pytorch中用于控制梯度计算的一个上下文管理器,在torch.no_grad()
的上下文中执行操作中,它会告诉Autograd暂时不需要为这些操作计算梯度。
使用场景:
- 模型评估:
在评估模型性能时,我们通常不需要计算梯度,因此可以使用
torch.no_grad()
来避免不必要的计算。 - 推理:
在部署模型进行实际推理时,同样不需要计算梯度,使用
torch.no_grad()
可以加快推理速度并减少内存消耗。 - 特定操作:
有时,在训练过程中,某些特定操作(如指标计算)不需要梯度信息,可以在这些操作的代码块中使用
torch.no_grad()
。
torch.no_grad()
通常与with
一起使用:
1 |
|
错误:
1 |
|
神经网络的评估模式和训练模式
https://blog.shinebook.net/2025/03/07/人工智能/pytorch/神经网络的评估模式和训练模式/