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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 09:54:24