使用Data Generator时混淆矩阵与模型精度结果不一致的问题
问题:混淆矩阵与模型评估精度不符
我用以下代码训练模型:
epoch=100 model_history = model.fit(train_generator, epochs=epoch, validation_data=test_generator, callbacks=[model_es, model_rlr, model_mcp])
训练完成后,执行model.evaluate(test_generator)评估模型,得到98.93%的精度,输出结果:
41/41 [==============================] - 3s 68ms/step - loss: 0.0396 - accuracy: 0.9893
[0.039571091532707214, 0.9893211126327515]
但用以下代码生成的混淆矩阵,结果与上述精度严重不符:
y_pred = model.predict(test_generator) y_pred = np.argmax(y_pred, axis=1) print(confusion_matrix(test_generator.classes, y_pred))
输出的混淆矩阵:
[[ 68 66 93 73] [ 64 65 93 84] [ 91 102 126 86] [ 69 75 96 60]]
请问如何获取模型的真实混淆矩阵?
原因分析
核心问题是测试数据生成器的样本顺序不匹配:
- 若
test_generator设置了shuffle=True,model.predict(test_generator)输出的预测结果顺序,会和test_generator.classes的原始样本顺序不一致,导致混淆矩阵计算完全错误。 - 调用
predict或evaluate后,生成器的内部指针会移动,若不重置,后续获取的数据顺序会混乱。
正确获取混淆矩阵的步骤
1. 重置测试生成器状态
在预测前重置生成器,确保从数据集起始位置读取样本:
test_generator.reset()
2. 按预测顺序收集真实标签
不要直接使用test_generator.classes,而是通过生成器分批获取真实标签,保证和预测结果的顺序严格对应:
import numpy as np y_true = [] # 遍历生成器的所有批次 for _ in range(len(test_generator)): # 获取当前批次的特征和标签(若标签是独热编码格式) _, batch_labels = test_generator.next() # 将独热编码转成类别索引,若标签本身是整数则直接extend(batch_labels) y_true.extend(np.argmax(batch_labels, axis=1))
3. 生成预测结果并计算混淆矩阵
from sklearn.metrics import confusion_matrix # 生成预测结果 y_pred = model.predict(test_generator, verbose=1) y_pred = np.argmax(y_pred, axis=1) # 计算并输出真实混淆矩阵 print(confusion_matrix(y_true, y_pred))
额外注意事项
- 确保
test_generator的shuffle参数在评估和预测时保持一致:如果评估时用shuffle=False,预测阶段也需保持该设置,避免顺序混乱。 - 若使用
flow_from_directory创建生成器,需明确指定classes参数,确保类别顺序固定。
内容的提问来源于stack exchange,提问作者Raja Singh
相关产品推荐
相关产品推荐

