如何结合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
相关产品推荐
相关产品推荐

