Keras中如何获取图像分类的百分比预测及Top5类别?
没问题!你的模型最后一层用了Softmax激活,所以model.predict()返回的其实就是每个类别的概率值,只是因为部分概率太小被默认的打印格式隐藏成0了。下面给你具体的解决步骤:
解决方法
1. 查看完整的类别概率(百分比)
你可以通过设置numpy的打印选项,让所有小数值都显示出来,这样就能看到每个类别的具体概率(乘以100就是对应的百分比):
import numpy as np # 设置numpy打印参数:禁用科学计数法,保留6位小数 np.set_printoptions(suppress=True, precision=6) # 你的单张图像预测代码 img = image.load_img('C:/Users/Kinga/Desktop/user_test/2.jpg', target_size=(32, 32)) x = image.img_to_array(img) x = np.expand_dims(x, axis=0) images = np.vstack([x]) classes = model.predict(images) print(classes)
执行后,你会看到类似这样的输出(示例):
[[0.000001 0.000002 0.000000 ... 0.000000 0.999950 0.000000]]
把每个数值乘以100,就是对应类别的预测百分比。
2. 获取置信度Top5的类别
可以用numpy的排序工具提取Top5高置信度的类别索引和对应的概率值,示例代码如下:
# 取出单张图片的预测结果(predict返回批量结果,取第一个元素) pred_probs = classes[0] # 获取Top5置信度的类别索引,按置信度从高到低排序 top5_indices = pred_probs.argsort()[-5:][::-1] # 获取对应的置信度值 top5_probs = pred_probs[top5_indices] # 打印Top5结果 print("Top5 类别索引及置信度:") for idx, prob in zip(top5_indices, top5_probs): print(f"类别 {idx}: {prob * 100:.2f}%")
如果你有预先定义的类别名称列表,还可以把索引替换成具体名称:
# 假设你有20个类别的名称列表 class_names = ["类别0", "类别1", "类别2", "类别3", "类别4", "类别5", "类别6", "类别7", "类别8", "类别9", "类别10", "类别11", "类别12", "类别13", "类别14", "类别15", "类别16", "类别17", "类别18", "类别19"] print("Top5 类别及置信度:") for idx, prob in zip(top5_indices, top5_probs): print(f"{class_names[idx]}: {prob * 100:.2f}%")
补充说明
你之前看到的输出全是0(除了一个1),是因为模型对第6个类别(索引5,从0开始计数)的置信度接近100%,其他类别的概率极小,numpy默认的打印格式会把这些极小值显示为0,设置打印选项后就能看到真实的小数值了。
内容的提问来源于stack exchange,提问作者valvore92
相关产品推荐
相关产品推荐

