
使用 onnx2torch 将 ONNX 模型(如 Pangu-Weather)转换为 PyTorch 可训练模型后,其返回对象是 GraphModule 类型,不可下标访问(如 tm[0]),但支持标准 nn.Module 接口——直接调用 tm.parameters() 即可遍历所有可学习权重。
使用 `onnx2torch` 将 onnx 模型(如 pangu-weather)转换为 pytorch 可训练模型后,其返回对象是 `graphmodule` 类型,不可下标访问(如 `tm[0]`),但支持标准 `nn.module` 接口——直接调用 `tm.parameters()` 即可遍历所有可学习权重。
onnx2torch 转换生成的 GraphModule 是一个符合 PyTorch 模块协议的轻量级封装,它不是传统 nn.Sequential 或自定义 nn.Module 的子类,因此不支持索引(tm[0])、键访问(tm['layer1'])或直接属性遍历(如 tm.conv1.weight)——这些操作会触发 TypeError: 'GraphModule' object is not subscriptable。但关键在于:它完整继承了 nn.Module 的核心行为,包括参数注册、梯度追踪与状态管理。
✅ 正确访问权重的方式如下:
import torch
# 获取所有可学习参数(返回 generator)
for name, param in tm.named_parameters():
print(f"{name}: {param.shape} | requires_grad={param.requires_grad}")
# 或仅获取参数张量(无名称)
params = list(tm.parameters())
print(f"Total trainable parameters: {len(params)}")
print(f"First parameter shape: {params[0].shape}")⚠️ 注意事项:
- tm.state_dict() 同样可用,返回 OrderedDict 形式的参数映射,适合保存/加载或调试;
- 若需修改特定层权重(如冻结某部分),建议先通过 named_parameters() 定位名称,再结合 requires_grad=False 控制梯度;
- tm.modules() 和 tm.children() 也可用于遍历子模块,但 GraphModule 的内部结构是扁平化的计算图节点,模块层级可能与原始 ONNX 不完全对应,不推荐依赖模块树做权重定位;
- 切勿尝试 tm._modules 或 tm.__dict__ 手动解析——GraphModule 的内部实现与常规 nn.Module 差异较大,直接访问易出错。
? 实用技巧:若需将权重导出为 NumPy 或检查数值分布,可这样做:
# 提取第一个卷积权重并转为 numpy(示例)
first_param = next(tm.parameters())
print("Weight min/max:", first_param.min().item(), first_param.max().item())
np_weights = first_param.detach().cpu().numpy()总结:GraphModule 是 PyTorch 兼容的“黑盒式”图表示,其设计初衷是保证计算图完整性与可导性,而非提供直观的模块化接口。掌握 parameters()、named_parameters() 和 state_dict() 这三个标准方法,即可安全、高效地完成微调(finetuning)、权重分析与模型诊断等全部下游任务。


















