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
相关产品推荐
相关产品推荐

