如何获取Keras训练的VGG16模型预测结果的标签及置信度百分比
解决方案
你遇到的问题核心是:Keras内置的decode_predictions仅适配官方预训练VGG16对应的ImageNet 1000分类标签,无法匹配你自定义训练的Fruits360数据集分类,你代码中已经生成了和训练集分类顺序一致的labels列表,直接用该列表做索引映射即可。
1. 单张图片Top1预测结果获取
在你现有代码的print(yhat)后添加以下代码:
import numpy as np # 获取概率最高的类别索引 pred_idx = np.argmax(yhat[0]) # 映射到对应分类标签 pred_label = labels[pred_idx] # 计算置信度百分比,保留2位小数 pred_confidence = round(float(yhat[0][pred_idx]) * 100, 2) print(f"预测分类:{pred_label},置信度:{pred_confidence}%")
2. 获取置信度TopN的结果(示例取Top5)
如果需要输出多个高置信度的候选结果,可使用以下代码:
import numpy as np # 取概率从高到低排序的前5个索引 topn = 5 topn_idx = np.argsort(yhat[0])[::-1][:topn] print(f"===== Top{topn} 预测结果 =====") for idx in topn_idx: confidence = round(float(yhat[0][idx]) * 100, 2) print(f"分类:{labels[idx]},置信度:{confidence}%")
注意事项
- 你当前生成
labels的逻辑是对训练集子目录排序后生成,需保证训练模型时分类索引的生成逻辑和该逻辑完全一致:如果你训练时使用Keras的ImageDataGenerator加载数据集,其默认生成的class_indices就是按sorted(训练集子目录名)的顺序生成的,无需额外调整。 - 为避免后续训练/测试路径变动导致标签顺序不匹配,建议在训练阶段就把标签映射关系保存下来,示例代码如下:
训练阶段保存标签映射
import json # 训练时生成训练数据生成器train_generator后执行 label_map = train_generator.class_indices # 反转键值对,方便后续用索引直接取标签 label_map = {v: k for k, v in label_map.items()} # 保存到本地文件 with open("fruit_label_map.json", "w", encoding="utf-8") as f: json.dump(label_map, f, ensure_ascii=False)
测试阶段加载标签映射
import json with open("fruit_label_map.json", "r", encoding="utf-8") as f: labels = json.load(f)
内容的提问来源于stack exchange,提问作者ProgramHub
相关产品推荐
相关产品推荐

