pytorch中的几个概念

发布于:2025-06-30 ⋅ 阅读:(21) ⋅ 点赞:(0)

几个容器:

nn.Sequential

nn.ModuleList

nn.ModuleDict

单个容器都会将变量加入parameter中,进行追踪和更新

区别:Sequential 不 用定义forward,会自动顺序执行各个子模块

        ModuleList和ModuleDict不会自动forward,需要子定义forward顺序,所以需要自定义继承至nn.Module的类,实现forward

model.modules() 递归的显示所有模块

model.named_modules() 递归的显示所有模块,生成器的元素是(name,param)

model.children() 子模块,子模块内部的细节不显示

model.named_children() 子模块

model.parameters() 显示所以参数,只显示tensor

model.named_parameters() 显示带名称的tensor,

注意梯度在tensor.glad中,需要进行backward()后才会有梯度值,不然都是None。

  • 必须在执行loss.backward()后才有梯度值4
  • 执行optimizer.step()后梯度会被清零

检查未更新参数(调试用) 用于排查梯度消失/爆炸问题

loss.backward()
unupdated = []
for name, param in model.named_parameters():
    if param.grad is None:
        unupdated.append(name)
print(f"未更新参数: {unupdated}")

使用torch.no_grad()可避免不必要的梯度计算和存储:

with torch.no_grad():    # 显存优化关键:ml-citation{ref="8" data="citationList"}
    outputs = model(inputs)
状态 含义 常见原因
Tensor 有效梯度 正常反向传播
None 无梯度 未执行backward或参数冻结2
全0 梯度消失 网络结构或初始化问题

梯度裁剪‌:防止爆炸

torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)

显存监控‌:

print(torch.cuda.memory_allocated())  # 查看当前显存占用

 通过.grad查看梯度是核心方法,结合named_parameters()可定位到具体层34。分布式训练需设置find_unused_parameters=False确保完整检测2。


网站公告

今日签到

点亮在社区的每一天
去签到