PyTorch加载自身导出的.h5模型提示ModuleNotFoundError如何解决?
报错原因
你遇到的ModuleNotFoundError: No module named 'model'报错和导入缺失直接相关,核心是PyTorch的序列化逻辑导致的:
torch.save直接保存完整模型对象时,默认使用pickle机制,不会存储模型类NSNetModel的完整定义,只会存储该类在你导出环境中的引用路径(也就是你导出时NSNetModel是从model模块导入的)- 加载模型的环境中,没有对应路径的
model模块,也没有提前导入NSNetModel类,pickle反序列化时找不到对应的类定义就会抛出这个错误
另外补充说明:你使用.h5作为模型文件后缀不影响加载逻辑,只是该后缀通常用于HDF5格式/Keras模型,容易引发混淆,建议后续使用PyTorch官方推荐的.pth/.pt后缀。
解决方案
方案1:补全导入(适配现有模型文件)
在执行torch.load之前,保证NSNetModel的导入路径和你导出模型时的路径完全一致即可,比如你导出时的导入语句为from model import NSNetModel,加载代码前先执行同一句导入即可。
如果找不到原model模块,也可以用临时模块映射的方式应急加载:
import torch import sys # 此处导入你自己的NSNetModel类,替换为实际的导入语句 from your_module_path import NSNetModel # 手动将缺失的model模块映射到当前NSNetModel所在的模块 sys.modules['model'] = sys.modules['your_module_path'] # 再加载模型 loaded_model = torch.load('/Users/me/tmp_model.h5')
方案2:调整导出逻辑(推荐,避免路径依赖)
后续导出模型时只保存权重参数,不保存完整模型对象,彻底避免类路径依赖问题:
导出代码调整
from pathlib import Path import torch ckpoint = 'version_131/epoch=171-step=1375.ckpt' model = NSNetModel.load_from_checkpoint(Path('/Users/dev/Documents/models/'+ckpoint)) # 仅保存模型权重字典 torch.save(model.state_dict(), 'tmp_model_weights.pth')
加载代码
import torch # 导入你的模型类 from your_module_path import NSNetModel # 先实例化模型类 model = NSNetModel() # 加载权重到实例中 model.load_state_dict(torch.load('tmp_model_weights.pth'))
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

