使用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
相关产品推荐
相关产品推荐

