为何TensorFlow模型预测时会报告错误的高置信度结果?
置信度超100%问题排查结果
核心原因
你当前模型最后一层使用的是无激活函数的全连接层,输出值为原始logits:
outputs = tf.keras.layers.Dense(3)(x)
logits本身的取值范围是 (-∞, +∞),没有上下限,仅用来反映不同类别的优先级,不具备0~1范围的概率属性,直接将其作为置信度使用自然会出现数值超过1(即超过100%)的情况,同时也无法匹配预测结果的真实可信程度,会出现预测错误时数值仍然很高的问题。
修复方案
有两种可行的修复方式,二选一即可:
- 修改模型结构,在最后一层添加softmax激活,直接输出归一化后的类别概率
调整最后一层代码为:outputs = tf.keras.layers.Dense(3, activation='softmax')(x)
调整后模型输出值为每个类别对应0~1之间的概率,所有类别概率总和为1,乘以100即可得到常规的百分比置信度。 - 不改动现有模型结构,推理阶段对输出的logits做softmax转换
拿到模型输出的logits后额外加一步计算:confidences = tf.nn.softmax(outputs).numpy()
计算得到的confidences即为0~1范围的归一化置信度。
注意:如果你的模型训练时用的是
from_logits=True的交叉熵损失函数,推荐选择第二种方案,不需要重新训练模型即可得到正确的置信度。
内容的提问来源于stack exchange,提问作者user17020095
相关产品推荐
相关产品推荐

