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

计算预训练CNN模型混淆矩阵时样本数量不一致报错求解

错误原因分析

这个报错的核心是真实标签和预测结果的样本数量不匹配:你的测试集真实标签只有16979个,但生成的预测结果有271664个,导致混淆矩阵无法计算,具体成因有三个:

  • 预训练模型加载不规范:加载MobileNet时没有设置include_top=False,保留了原模型针对ImageNet数据集设计的1000类分类头,后续叠加自定义分类层后,模型输出维度和逻辑异常,导致预测结果数量不符合预期。
  • 预测步数计算错误:手动用整除//计算测试步数,当测试集总数无法被batch_size整除时,要么会漏掉最后一个不完整批次的样本,要么旧版本Keras的生成器会循环输出数据,导致预测样本数远大于真实样本数。
  • 使用弃用接口:predict_generator已经在新版TensorFlow中被弃用,接口逻辑与当前主流的predict接口存在差异,容易触发意料之外的错误。
解决方案

第一步:修正预训练模型加载

加载预训练模型时去掉原模型的顶层分类头,指定匹配的输入形状,替换代码如下:

# 原代码:basemodel = tf.keras.applications.mobilenet.MobileNet()
basemodel = tf.keras.applications.mobilenet.MobileNet(include_top=False, input_shape=(224, 224, 3))

第二步:修正预测逻辑

删除手动计算测试步数的逻辑,直接使用model.predict接口自动遍历所有测试样本,替换代码如下:

# 删掉原有的STEP_SIZE_TEST计算逻辑
test_data.reset()
y_pred = model.predict(test_data, verbose=1)
predicted_class = np.argmax(y_pred, axis=1)

model.predict传入数据生成器时会自动匹配所有样本,不会出现多生成或者漏生成样本的问题。

第三步(兼容旧版本TensorFlow可选)

如果你使用的TensorFlow版本必须指定预测步数,将步数计算改为向上取整,同时截取和真实标签数量一致的预测结果:

import numpy as np
STEP_SIZE_TEST = int(np.ceil(test_data.n / test_data.batch_size))
test_data.reset()
y_pred = model.predict(test_data, steps=STEP_SIZE_TEST, verbose=1)
predicted_class = np.argmax(y_pred, axis=1)[:test_data.n]

完成以上修改后,预测结果的样本数量会和真实标签完全匹配,混淆矩阵即可正常计算。

内容的提问来源于stack exchange,提问作者user15457402

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 16:27:01