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

Keras二进制分类任务中预测仅返回单类概率问题求助

解决EfficientNet二分类预测结果对应类别不明确的问题

这个问题在二分类任务里特别常见,咱们一步步拆解解决:

为什么只输出单个概率?

看你的模型定义,最后一层用的是Dense(1, activation='sigmoid')——这是二分类任务的标准配置。sigmoid函数输出的是其中一个类别的概率值(范围0到1),另一个类别的概率直接用1 - 这个值就能得到,所以模型不需要输出两个神经元。

但关键是要搞清楚:这个概率对应的是哪个类别?

核心解决方法:找到训练时的类别映射关系

你训练模型时用的train_generator(就是fit_generator里的那个),它有个class_indices属性,这是个字典,保存了类别名称到0/1的映射。比如你的训练目录是train/cat和train/dog,class_indices可能是{'cat': 0, 'dog': 1}(默认按目录名的字母顺序排序)。

情况1:还能访问训练时的生成器

直接打印这个映射:

print(train_generator.class_indices)

输出类似:{'class_name_0': 0, 'class_name_1': 1},那么预测值接近1就对应class_name_1,接近0对应class_name_0。

情况2:已经关闭了训练环境,没法访问原生成器

没关系,只要你的测试目录结构和训练一致(比如real_test下也是两个类别子目录),可以临时创建一个生成器来获取映射:

temp_gen = test_image_generator.flow_from_directory(
    directory='/content/real_test',
    target_size=(224, 224),
    color_mode="rgb",
    batch_size=1,
    class_mode='binary',  # 只是为了获取类别映射,不需要实际标签
    shuffle=False
)
print(temp_gen.class_indices)

把预测结果转换成类别名称

拿到映射后,就可以把单个概率值转换成对应的类别了。比如:

# 假设我们拿到的类别映射是 {'normal': 0, 'abnormal': 1}
class_map = {'normal': 0, 'abnormal': 1}
# 反转映射,方便根据索引找类别名
reverse_map = {v: k for k, v in class_map.items()}

# 处理你的预测结果pred
pred_probs = pred.flatten()  # 把二维数组转成一维
pred_labels = []

for prob in pred_probs:
    # 用0.5作为默认阈值,你也可以根据需求调整
    class_idx = 1 if prob >= 0.5 else 0
    pred_labels.append(reverse_map[class_idx])

# 输出结果
print("每张图片的预测类别:", pred_labels)
print("对应类别的概率:", pred_probs)

额外提示

  • 如果想让模型直接输出两个类别的概率,可以把最后一层改成Dense(2, activation='softmax'),同时损失函数换成categorical_crossentropy,训练时class_mode设为'categorical'——不过这对你已经训练好的模型来说需要重新训练,所以更高效的还是用上面的方法处理现有预测结果。
  • 阈值0.5不是固定的,可以根据你的任务需求调整(比如如果想减少假阳性,把阈值调高)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 13:32:37