You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

仅持有神经网络.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 17:02:10