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

Keras模型调用predict报错:History对象无predict属性求助

解决AttributeError: 'History' object has no attribute 'predict'问题

这个错误是很容易踩的小坑,我来帮你一步步梳理问题和解决方案:

核心问题:混淆了模型对象与训练历史对象

你执行result = model.fit_generator(...)时,result返回的是**History对象**——它的作用仅仅是存储训练过程中的损失值、准确率等日志数据,并没有predict方法。真正具备预测能力的是你定义的model对象,也就是那个基于VGG19构建的Sequential模型。

完整修正方案

1. 替换预测调用对象

把preds = result.predict(x)改成preds = model.predict(x),这是解决报错的关键一步。

2. 匹配VGG19的预处理逻辑

你参考的代码用了VGG16的preprocess_input,但你的模型是基于VGG19构建的,两者预处理规则有细微差异,需要替换成对应VGG19的预处理函数:

from keras.applications.vgg19 import preprocess_input  # 替换原VGG16的导入语句

3. 正确解析二分类预测结果

你的模型是肺炎检测二分类任务,输出层用了sigmoid激活,所以preds是0到1之间的概率值(假设1代表肺炎,0代表正常)。而decode_predictions是专门用来解析ImageNet预训练模型的1000类分类结果的,完全不适用你的二分类场景,需要删掉这个函数,改成自己判断概率:

preds = model.predict(x)[0][0]  # 取出单个样本的概率值
if preds > 0.5:
    print(f"预测结果:肺炎,概率{preds:.4f}")
else:
    print(f"预测结果:正常,概率{1 - preds:.4f}")

修正后的完整代码片段

from keras.preprocessing import image
from keras.applications.vgg19 import preprocess_input  # 修正为VGG19的预处理
import numpy as np

img_path = '/home/workstation/Desktop/covid/1.jpeg'
img = image.load_img(img_path, target_size=(150, 150))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)  # 使用VGG19对应的预处理逻辑

# 用model做预测,而非训练历史对象result
preds = model.predict(x)[0][0]  
# 解析二分类预测结果
if preds > 0.5:
    print(f"Predicted: 肺炎 (概率: {preds:.4f})")
else:
    print(f"Predicted: 正常 (概率: {1 - preds:.4f})")

额外提示:关于热力图生成

如果你最终目标是生成Grad-CAM热力图(参考Chollet《Python深度学习》中的实现),接下来还需要:

  • 定位模型中VGG19的最后一个卷积层(比如conv_base.get_layer('block5_conv4'))
  • 计算预测类别梯度相对于该卷积层输出的导数
  • 对梯度做全局平均池化得到权重
  • 用权重加权卷积层输出,最终生成热力图

这部分可以继续参考书中的Grad-CAM代码,但要注意匹配你当前模型的结构。

内容的提问来源于stack exchange,提问作者mimus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 06:42:37