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

如何可视化二分类图像分类器错误预测并生成分类报告

解决方案

核心前置要求

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 19:36:02