PyTorch CNN推理报错TypeError: 'NoneType'对象不可调用的原因与解决
错误原因分析
- 核心问题是
load_model函数返回了None,导致trained_model为None类型,无法像模型实例那样被调用执行前向传播(即trained_model(img)的调用方式失效)。 - 常见触发场景:
load_model函数内部遗漏了return model语句,完成权重加载后没有返回处理后的模型实例。save_path指向的模型文件不存在、路径错误,或文件损坏/格式不兼容,导致加载失败但函数未抛出异常,默认返回None。- 模型权重加载逻辑错误,比如仅加载了
state_dict但未调用model.load_state_dict()完成参数映射,或调用方式有误。
解决步骤
修复
load_model函数的返回逻辑
确保函数完成权重加载后返回模型实例,示例实现如下:def load_model(model, save_path): # 加载训练保存的权重字典 state_dict = torch.load(save_path) # 将权重映射到模型参数 model.load_state_dict(state_dict) # 必须返回模型 return model若你的
load_model中没有return model语句,直接补上即可。验证模型文件的有效性
- 打印
save_path的值,确认路径指向的.pth/.pt模型文件确实存在。 - 若文件不存在,检查训练代码中保存模型的路径与推理代码是否一致;若文件损坏,重新训练并保存模型。
- 打印
提前修正Predictor类的索引错误
当前报错未触发此问题,但后续会引发新错误:Predictor类中predicted_label = self.class_index(max_id)使用了圆括号索引列表,需改为方括号:predicted_label = self.class_index[max_id]优化推理效率(可选)
每次调用predict都重新初始化模型、加载权重会浪费资源,建议将模型初始化和权重加载移到函数外部:# 全局初始化并加载模型,仅执行一次 model = CNN() trained_model = load_model(model, save_path) trained_model.eval() def predict(img): # 仅处理输入图像与推理 transform = ImageTransform(resize, mean, std) img = transform(img, phase="test") img = img.unsqueeze_(0) output = trained_model(img) response = predictor.predict_max(output) return response
内容的提问来源于stack exchange,提问作者DarioLong
相关产品推荐
相关产品推荐

