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

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()完成参数映射,或调用方式有误。
解决步骤
  1. 修复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语句,直接补上即可。

  2. 验证模型文件的有效性

    • 打印save_path的值,确认路径指向的.pth/.pt模型文件确实存在。
    • 若文件不存在,检查训练代码中保存模型的路径与推理代码是否一致;若文件损坏,重新训练并保存模型。
  3. 提前修正Predictor类的索引错误
    当前报错未触发此问题,但后续会引发新错误:Predictor类中predicted_label = self.class_index(max_id)使用了圆括号索引列表,需改为方括号:

    predicted_label = self.class_index[max_id]
    
  4. 优化推理效率(可选)
    每次调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 13:43:06