如何可视化二分类图像分类器错误预测并生成分类报告
解决方案
核心前置要求
使用flow_from_directory生成的迭代器做预测前,必须开启shuffle=False参数,保证预测输出的顺序和迭代器内置标签的顺序完全匹配,这是标签对齐的核心前提。
flow_from_directory迭代器自带三个可直接调用的属性,无需手动遍历获取标签:
classes:按迭代顺序排列的所有样本真实标签数组,长度和测试集样本数一致filenames:按迭代顺序排列的所有样本相对路径数组,可直接拼接路径读取原图class_indices:类别名到标签值的映射字典
1. 生成分类报告
完整实现代码如下:
from sklearn.metrics import classification_report import numpy as np import matplotlib.pyplot as plt import os # 修正测试迭代器配置,新增shuffle=False new_test_generator = test_datagen.flow_from_directory( directory = test_dir, target_size=(150,150), batch_size=32, # 可自由调整批量大小,不影响标签顺序 class_mode='binary', seed = 42, shuffle = False # 必须配置的参数 ) # 获取模型预测概率 predictions = model.predict(new_test_generator) # 二分类按阈值0.5转换为0/1标签,拉平为1维数组 pred_labels = (predictions > 0.5).astype('int32').flatten() # 直接获取测试集真实标签 true_labels = new_test_generator.classes # 输出分类报告 print(classification_report( true_labels, pred_labels, target_names=list(new_test_generator.class_indices.keys()) ))
2. 可视化预测错误样本
基于获取到的真实标签、预测标签、文件路径,直接读取错误样本展示即可,无需反复调用迭代器的next()方法,效率更高:
# 提取所有预测错误的样本索引 error_idxs = np.where(pred_labels != true_labels)[0] # 反转类别映射,方便展示标签名称 idx_to_class = {v:k for k,v in new_test_generator.class_indices.items()} # 示例:展示前9个预测错误的样本 plt.figure(figsize=(12,12)) for plot_i, err_idx in enumerate(error_idxs[:9]): # 拼接错误样本的完整路径 img_full_path = os.path.join(test_dir, new_test_generator.filenames[err_idx]) img = plt.imread(img_full_path) # 子图展示 plt.subplot(3, 3, plot_i+1) plt.imshow(img) plt.axis('off') # 标题标注真实标签和预测标签 plt.title(f"真实类别:{idx_to_class[true_labels[err_idx]]}\n预测类别:{idx_to_class[pred_labels[err_idx]]}") plt.tight_layout() plt.show()
注意事项
所有读取标签、预测、评估操作要使用同一个迭代器实例,不要混用不同的迭代器对象,避免出现顺序不匹配的问题。
内容的提问来源于stack exchange,提问作者Randy Chng
相关产品推荐
相关产品推荐

