pytorch中的几个概念
几个容器:
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。