TensorFlow 默认使用什么阈值来将输入图像分类为特定类别?
例如,假设我有三个类别 0
、1
、2
,图像的标签是这样的独热编码:[1, 0, 0]
,这意味着该图像的标签是类别 0。
现在,当模型在 softmax 之后输出一个像这样的预测:[0.39, 0.56, 0.05]
,TensorFlow 是否使用 0.5 作为阈值,从而预测的类别是类别 1?
如果所有预测值都低于 0.5,例如 [0.33, 0.33, 0.33]
,TensorFlow 会说结果是什么?
还有没有办法指定一个新的阈值,例如 0.7,并确保如果没有类别的预测值超过这个阈值,TensorFlow 会认为预测是错误的?
另外,这种逻辑是否也会应用到推理阶段,如果网络对类别不确定,则会拒绝对图像进行分类?
回答:
当模型在 softmax 之后输出一个像这样的预测:
[0.39, 0.56, 0.05]
,TensorFlow 是否使用 0.5 作为阈值,从而预测的类别是类别 1?
不是。这里没有涉及任何阈值。TensorFlow(以及任何其他框架)只会选择最大值(argmax
);即使概率输出是 [0.33, 0.34, 0.33]
,结果(类别 1
)也将是相同的。
你似乎错误地认为在三类分类问题中,概率值 0.5 具有特殊意义;它没有:概率值 0.5 在二元分类设置中(并且是平衡的)才具有“特殊性”。在 n
类设置中,相应的“特殊”值是 1/n
(这里是 0.33),而且根据定义,概率向量中总会有一些条目大于或等于这个值。
如果所有预测值都低于 0.5,例如
[0.33, 0.33, 0.33]
,TensorFlow 会说结果是什么?
如前所述,在 n 类问题中(n>2),所有概率低于 0.5 并没有什么奇怪或意外的地方。
现在,如果所有概率都相等,如你所示的例子(尽管在实践中这种情况极不可能,但至少在理论上问题是有效的),理想情况下,这种平局应该随机解决(即随机选择一个类别);在实践中,由于通常这一阶段由 Numpy 的 argmax
方法处理,预测将是第一个类别(即类别 0
),这不难证明:
这是由于 Numpy 处理这种情况的方式 – 从 argmax
文档中可以看到:
如果最大值多次出现,则返回第一次出现的索引。
关于你的下一个问题:
有没有办法指定一个新的阈值,例如 0.7,并确保如果没有类别的预测值超过这个阈值,TensorFlow 会认为预测是错误的?
在 TensorFlow(或任何其他框架)本身中没有,但这总是在推理期间的后处理阶段可以做到的:不管你的分类器实际返回什么,总是可以添加一些额外的逻辑,以便当最大概率值低于某个阈值时,你的系统(即你的模型加上后处理逻辑)返回类似于“我不知道 / 我不确定 / 我无法回答”的内容。但再次强调,这是外部于 TensorFlow(或任何其他使用的框架)以及模型本身的,并且只能在推理期间使用,而不能在训练期间使用(在任何情况下,训练期间都没有意义,因为训练期间只使用预测的类别概率,而不使用硬类别)。
事实上,我们几年前在玩具项目中实现了这样的后处理模块,该项目是一个在线服务,用于从图像中分类狗的品种:当模型返回的最大概率低于某个阈值时(例如,当模型被展示了一张猫的图像而不是狗时),系统被编程为以“你确定这是狗吗?”的问题来响应,而不是被迫在预定义的狗品种中做出预测…