with torch.no_grad()
with torch.no_grad()
在深度学习的世界里,模型训练与评估是两个相互独立却又紧密相连的过程。训练时我们需要梯度来更新模型参数,但在评估阶段,梯度计算则称为了不必要的负担。with torch.no_grad()正是为此而生-----它允许我们在不记录梯度的情况下执行前向传播,从而节省内存并加速推理过程。
eval()
.eval()是Pytorch中用于切换模型到评估模式的方法。在评估模式下,某些层(如BatchNorm和Dropout)的行为会发生变化。例如,BatchNorm层在训练模式下会使用mini-batch的统计信息来标准化输入,而在评估模式下则使用整个训练集的移动平均统计信息。这意味着,即使不打算更新权重,我们也需要调用.eval()来确保模型处于正确的状态。
案例比较
import time
import torch
from torch.utils.data import DataLoader
# 假设 model 是已经训练好的模型
model = torch.load('trained_model.pth')
model.eval()
# 准备一批数据
data_loader = DataLoader(dataset, batch_size=32, shuffle=False)
# 启用梯度计算的情况
start_time = time.time()
for inputs, labels in data_loader:
outputs = model(inputs)
end_time = time.time()
print("With gradient calculation:", end_time - start_time)
# 禁用梯度计算的情况
start_time = time.time()
with torch.no_grad():
for inputs, labels in data_loader:
outputs = model(inputs)
end_time = time.time()
print("Without gradient calculation:", end_time - start_time)
性能优化技巧:
- 内存管理:在大数据集上进行预测时,禁用梯度计算可以显著减少内存占用。
- 批处理:尽可能地使用批量数据进行预测,这样可以充分利用GPU的并行计算能力,进一步提升性能。
- 模型优化:考虑更轻量级的模型架构,或者在不影响准确率的前提下裁剪掉不必要的层。
参考文献:
https://blog.csdn.net/qq_41813454/article/details/141731002
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架