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

posted @   小舟渡河  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示