Keras+TensorFlow下三类物体检测CNN模型的混淆矩阵生成问题
生成三类物体检测模型的混淆矩阵
我来帮你一步步搞定这个混淆矩阵的生成,其实核心就是要保证预测结果和真实标签的顺序完全对应,这是最容易踩的坑,咱们直接上实操步骤:
1. 加载模型与配置测试生成器
首先把你的模型加载进来,同时完善测试数据生成器的配置,这里一定要加上shuffle=False——因为你的测试集是按类别顺序排列的,打乱顺序会导致真实标签和预测结果错位:
from tensorflow.keras.models import load_model from tensorflow.keras.preprocessing.image import ImageDataGenerator import numpy as np # 加载训练好的模型 model = load_model('model.h5') # 定义测试数据生成器,注意必须设置shuffle=False test_datagen = ImageDataGenerator(rescale=1./255) test_generator = test_datagen.flow_from_directory( test_dir, target_size=(你的模型输入尺寸, 你的模型输入尺寸), # 比如(224,224),要和训练时一致 batch_size=32, # 可根据内存调整,最后一批会自动适配 class_mode='categorical', # 多分类场景用categorical,和训练时的损失函数匹配 shuffle=False # 绝对不能省略!保证数据顺序和测试集完全一致 )
2. 获取预测结果与真实标签
接下来用模型对测试集做预测,把概率转换成类别索引,同时提取真实标签:
# 生成预测概率 predictions = model.predict(test_generator) # 把概率转换为类别索引(取概率最大值对应的类) predicted_classes = np.argmax(predictions, axis=1) # 获取真实标签:test_generator.classes就是测试集每个样本的真实类别索引 true_classes = test_generator.classes # 获取类别名称与索引的对应关系,比如{'cat':0, 'dog':1, 'other':2} class_labels = list(test_generator.class_indices.keys())
3. 生成并可视化混淆矩阵
用scikit-learn生成混淆矩阵,再用seaborn画热力图,结果会更直观:
from sklearn.metrics import confusion_matrix import seaborn as sns import matplotlib.pyplot as plt # 生成混淆矩阵 cm = confusion_matrix(true_classes, predicted_classes) # 可视化混淆矩阵 plt.figure(figsize=(8,6)) sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', xticklabels=class_labels, yticklabels=class_labels) plt.xlabel('Predicted Label') plt.ylabel('True Label') plt.title('Confusion Matrix for Cat/Dog/Other Classification') plt.show()
关键注意事项
- shuffle=False是核心:如果不设置这个,测试生成器会打乱数据顺序,混淆矩阵的结果完全不可信。
- class_mode要匹配:如果训练时用的是
sparse_categorical_crossentropy损失,那class_mode要设为sparse,必须和训练配置一致。 - 输入尺寸统一:
target_size必须和训练模型时的输入尺寸完全相同,否则预测会出现错误。
这样就能得到准确的混淆矩阵,清晰看到模型在猫、狗、其他三类上的分类表现啦!
内容的提问来源于stack exchange,提问作者sayem48
相关产品推荐
相关产品推荐

