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

如何结合Confusion Matrix可视化模型测试样本的预测及错分图像

实现CNN错误分类样本的可视化方案

核心思路

先提取测试集的真实标签与预测结果,定位所有错误分类样本并按「真实标签→预测标签」的错误类型分组,结合混淆矩阵可视化的同时,批量展示每组错误样本的图像,直观分析模型误判规律。

代码实现步骤

1. 提取预测结果与标签映射

假设你用ImageDataGenerator加载测试集,先获取预测结果、真实标签及类别名称:

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.metrics import confusion_matrix

# 假设已加载训练好的模型model和测试生成器test_generator
predictions = model.predict(test_generator, verbose=1)
predicted_classes = np.argmax(predictions, axis=1)
true_classes = test_generator.classes
class_names = list(test_generator.class_indices.keys())

2. 定位错误分类样本并分组

创建字典存储不同错误类型对应的样本索引,方便后续批量可视化:

# 初始化错误分类字典:key=(真实标签, 预测标签), value=样本索引列表
misclassified_dict = {}
misclassified_idx = np.where(predicted_classes != true_classes)[0]

for idx in misclassified_idx:
    true_label = class_names[true_classes[idx]]
    pred_label = class_names[predicted_classes[idx]]
    key = (true_label, pred_label)
    if key not in misclassified_dict:
        misclassified_dict[key] = []
    misclassified_dict[key].append(idx)

3. 绘制带标注的混淆矩阵

用seaborn绘制混淆矩阵,同时标注每个单元格的错误样本数量:

plt.figure(figsize=(12, 10))
cm = confusion_matrix(true_classes, predicted_classes)
# 归一化可选,根据需求调整
cm_normalized = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]

sns.heatmap(cm_normalized, annot=cm, fmt='d', cmap='Blues',
            xticklabels=class_names, yticklabels=class_names)
plt.xlabel('预测标签')
plt.ylabel('真实标签')
plt.title('CNN模型混淆矩阵')
plt.show()

4. 批量展示错误分类样本图像

写一个函数,按错误类型批量展示样本,每组展示指定数量的图像:

def plot_misclassified_samples(misclassified_dict, test_generator, num_samples_per_group=4):
    for (true_label, pred_label), indices in misclassified_dict.items():
        print(f"真实标签: {true_label} → 误判为: {pred_label} (共{len(indices)}个样本)")
        # 截取指定数量的样本,避免展示过多
        sample_indices = indices[:num_samples_per_group]
        
        fig, axes = plt.subplots(1, len(sample_indices), figsize=(15, 5))
        if len(sample_indices) == 1:
            axes = [axes]
        
        for ax, idx in zip(axes, sample_indices):
            # 从测试生成器中加载图像
            img_path = test_generator.filepaths[idx]
            img = plt.imread(img_path)
            ax.imshow(img)
            ax.set_title(f"True: {true_label}\nPred: {pred_label}")
            ax.axis('off')
        
        plt.tight_layout()
        plt.show()

# 调用函数展示所有错误分类样本
plot_misclassified_samples(misclassified_dict, test_generator)

优化建议

  • 内存优化:如果测试集很大,不要一次性加载所有图像,按需从文件路径读取(如上述代码所示),避免内存溢出。
  • 交互增强:可以结合ipywidgets做交互式筛选,比如下拉选择错误类型再展示对应样本,适合Jupyter环境。
  • 统计分析:在混淆矩阵旁边添加错误分类的统计表格,展示每种错误类型的样本占比,辅助模型优化。

内容的提问来源于stack exchange,提问作者Ali Mustadji

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 11:49:54