仅持有神经网络.pth文件无源码,能否获取该网络的结构?
仅靠.pth文件获取网络结构的可行方法
你用torch.save(model, 'model.pth')保存的是完整模型对象,其中包含了模型的结构拓扑信息,即使没有原源码,也能通过以下方式提取结构:
直接加载并打印模型结构
加载时虽然会提示找不到原类定义,但可以通过自定义反序列化逻辑绕过限制,加载后直接打印模型结构:import torch import pickle # 自定义反序列化类,绕过原类定义缺失的问题 class CustomUnpickler(pickle.Unpickler): def find_class(self, module, name): try: return super().find_class(module, name) except AttributeError: # 用基础Module子类替代找不到的原类 from torch.nn import Module class DummyModule(Module): pass return DummyModule with open('model.pth', 'rb') as f: model = CustomUnpickler(f).load() # 打印基础结构 print(model) # 若需更详细的参数统计,可使用torchsummary from torchsummary import summary summary(model, input_size=(3, 224, 224)) # 替换为你的模型实际输入尺寸这种方法能直接输出模型的层顺序、各层类型、参数数量等核心结构信息。
递归遍历提取层级结构
模型对象的_modules属性包含了所有子模块的层级关系,可通过递归遍历手动解析结构:def parse_model_structure(module, indent=0): prefix = " " * indent print(f"{prefix}{type(module).__name__}") for name, sub_module in module._modules.items(): if sub_module is not None: print(f"{prefix} ├─ {name}:") parse_model_structure(sub_module, indent + 2) parse_model_structure(model)这会以层级化的方式输出所有子层的类型和嵌套关系。
关键注意点
- 如果你当初是用
torch.save(model.state_dict(), 'model.pth')仅保存参数字典,那确实无法直接获取结构;但你用的是保存完整模型的方式,因此包含结构信息。 - 上述方法无法还原原模型类的自定义方法,但能完整复现网络的拓扑结构(各层类型、参数尺寸、连接顺序等),足够用于模型推理或重新构建等价网络。
- 如果你当初是用
内容的提问来源于stack exchange,提问作者S. Yang
相关产品推荐
相关产品推荐

