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

使用image_dataset_from_directory的VGG16二分类模型如何生成混淆矩阵

问题1:image_dataset_from_directory 生成混淆矩阵时报零维数组拼接错误

该错误和prefetch配置无关,是你初始化存储结果的数组时维度不匹配导致的:
你初始定义的predicted_probs = np.empty([])、true_classes = np.empty([])是0维的标量数组,而循环中拿到的模型输出维度是(batch_size, 1)、标签维度是(batch_size,),维度不一致无法拼接,才抛出该错误。

修复方案:修改数组初始化代码即可,其余逻辑无需改动:

# 初始化维度匹配的空数组
predicted_probs = np.empty((0, 1))
true_classes =  np.empty((0,))

for images, labels in test_ds:
  predicted_probs = np.concatenate([predicted_probs, model(images)])
  true_classes = np.concatenate([true_classes, labels.numpy()])

问题2:二分类预测值转换逻辑验证

为什么用argmax得到全0结果

你的模型最终输出层是Dense(1),属于单神经元二分类结构,输出维度为(样本数, 1),argmax是取最后一维最大值的索引,而最后一维只有1个元素,索引永远为0,自然所有样本都会被判定为0类,该方法仅适用于输出为2个神经元的多分类结构。

0.5阈值转换逻辑的合理性

0.5是二分类任务最通用的判定阈值,逻辑为:当模型判定样本属于正类的概率≥50%时,就归为正类,否则归为负类,逻辑完全正确。
这里有一个细节补充:你训练时设置了from_logits=True,模型原始输出是未经过sigmoid激活的logits值,严格来说需要先转成概率再判定:

# 更严谨的转换逻辑
predicted_classes = [1 * (tf.sigmoid(x[0]) >= 0.5) for x in predictions]

不过从你给出的混淆矩阵结果来看,模型对正负样本的区分度极高,仅漏判7个样本,准确率超过99.9%,即使直接用原始输出和0.5比较,也不会影响最终结果,当前得到的混淆矩阵是完全可信的。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 08:15:04