ImageDataGenerator的.classes是否有序?如何获取预测对应真实标签?
解决混淆矩阵真实标签不匹配问题
核心问题:你混淆了
ImageDataGenerator生成器的两个属性:classes:返回的是所有类别的名称列表,并非对应每个测试样本的标签labels:返回的是每个测试样本对应的真实标签数组,顺序和model.predict()输出的y_pred完全匹配
正确操作步骤:
- 创建测试数据生成器时,必须设置
shuffle=False,保证样本顺序不打乱:test_datagen = ImageDataGenerator(rescale=1./255) test_generator = test_datagen.flow_from_directory( '测试数据集路径', target_size=(你的图片高度, 你的图片宽度), batch_size=你的批次大小, class_mode='categorical', # 若模型输出为稀疏标签则用'sparse' shuffle=False # 这步是关键,否则标签和预测结果顺序会错位 ) - 获取真实标签数组:
y_true = test_generator.labels - 处理预测结果并生成混淆矩阵:
import numpy as np from sklearn.metrics import confusion_matrix # 获取预测结果,若模型是categorical输出,转成类别索引 y_pred = model.predict(test_generator) y_pred = np.argmax(y_pred, axis=1) # 生成混淆矩阵 cm = confusion_matrix(y_true, y_pred)
- 创建测试数据生成器时,必须设置
验证方法:
打印len(y_true)和len(y_pred),两者长度必须相等;同时混淆矩阵的对角线占比应和模型准确率(95%)基本一致,说明标签和预测结果已正确对应。
内容的提问来源于stack exchange,提问作者Jordan Jackson
相关产品推荐
相关产品推荐

