Google Colab使用PyTorch加载模型报ModuleNotFoundError问题求助
报错原因
你遇到的ModuleNotFoundError: No module named 'models'是PyTorch模型序列化的常见问题,和第三方依赖无关:
- 训练模型时,模型类定义在名为
models的模块(本地的models.py文件或models包)下 - 保存模型时使用了
torch.save(model, 路径)的完整模型保存方式,该方式会把模型类的原始导入路径一起序列化 - Google Colab环境中没有对应的
models模块,反序列化加载时找不到类定义就会触发报错
解决方法
方法1:补全类定义+重定向模块
首先把训练时用到的所有模型相关类(包括fc_model.Network以及它依赖的自定义父类、函数)完整复制到Colab的代码中,然后在调用torch.load前添加如下代码,将当前运行环境的模块映射到原始的models路径:import sys # 若原始模型类定义在models模块下,添加这行映射 sys.modules['models'] = sys.modules[__name__] # 若原始模型类定义在models.fc_model子模块下,额外添加这行 # sys.modules['models.fc_model'] = sys.modules[__name__]完成后再调用你的加载函数即可正常读取模型。
方法2:仅加载模型权重(推荐)
该方式兼容性最强,不会依赖原始模块路径。如果能拿到原始训练代码,建议重新导出仅含权重的模型文件:
训练侧导出代码:# 仅保存权重字典,不要保存整个模型对象 torch.save(model.state_dict(), "best_weights_only.pt")Colab侧加载代码:
# 先在Colab中定义和训练时完全一致的模型类 model = fc_model.Network(input_size, output_size, hidden_layers) # 仅加载权重,不会触发类路径校验 model.load_state_dict(torch.load("best_weights_only.pt", map_location="cpu"))方法3:上传本地模块到Colab
直接将本地的models.py文件或者整个models包上传到Colab的工作目录,加载模型前先执行import models导入对应模块即可。
额外注意
你当前代码存在变量命名错误:load_checkpoint函数返回的是完成权重加载的完整模型对象,不是权重字典,建议把state_dict = load_checkpoint(PATH)修改为model = load_checkpoint(PATH),避免后续调用逻辑出错。
内容的提问来源于stack exchange,提问作者Mohamed Ibrahim
相关产品推荐
相关产品推荐

