Tensorflow & Keras 预测阈值



TF默认用于将输入图像分类为某个类的阈值是多少?

例如,假设我有 3 个类012,并且图像的标签是单热编码的,如下所示:[1, 0, 0],这意味着该图像的标签为 0 类。

现在,当模型在 softmax 之后输出像这样的预测时:TF[0.39, 0.56, 0.05]使用 0.5 作为阈值,因此它预测的类是类 1?

如果所有预测都低于 0.5[0.33, 0.33, 0.33]TF 会说结果是什么?

有没有办法指定一个新的阈值,例如 0.7,并确保 TF 说如果没有类预测超过该阈值,预测是错误的?

此外,这种逻辑也会延续到推理阶段,如果网络不确定该类,那么它将拒绝为图像进行分类?

当模型在 softmax 之后输出像这样的预测时:TF[0.39, 0.56, 0.05]使用 0.5 作为阈值,因此它预测的类是类 1?

不。这里不涉及任何门槛。Tensorflow(以及任何其他框架,就此而言(只会拾取最大的一个(argmax(;这里的结果(类1(将是相同的,即使概率输出是[0.33, 0.34, 0.33]

你似乎错误地认为概率值 0.5 在 3 类分类问题中具有某种特殊意义;事实并非如此:概率值 0.5 仅在二元分类设置中是"特殊的"(就此而言,是平衡的(。在n类设置中,相应的"特殊"值是1/n(此处为 0.33(,根据定义,概率向量中会有一些条目大于或等于该值。

如果所有预测都低于 0.5[0.33, 0.33, 0.33]TF 会说结果是什么?

正如已经暗示的那样,在n>2的n类问题中,所有概率都低于0.5,这没有什么奇怪或意外的。

现在,如果所有概率恰好相等,如你展示的例子(虽然在实践中极不可能,但这个问题是有效的,至少在理论上是这样(,理想情况下,这种联系应该是随机解决的(即随机选择一个类(; 在实践中,由于通常这个阶段由 Numpy 的argmax方法处理, 预测将是第一类(即.class0(,这不难证明:

import numpy as np
x = np.array([0.33, 0.33, 0.33])
np.argmax(x)
# 0

由于 Numpy 如何处理此类情况 - 来自argmax文档:

如果多次出现最大值,则返回与第一次出现对应的索引。

对于您的下一个问题:

有没有办法指定一个新的阈值,例如 0.7 并确保 TF 说如果没有类预测高于该阈值,预测是错误的?

不是在 Tensorflow(或任何其他框架(本身中,但这总是可以在推理的后处理阶段完成的:无论分类器实际返回的内容如何,总是可以添加一些额外的逻辑,这样每当最大概率值小于阈值时,您的系统(即您的模型加上后处理逻辑(返回类似">我不知道/我不确定/我不能回答"。但同样,这是 Tensorflow(或使用的任何其他框架(和模型本身的外部,它只能在推理期间使用,而不能在训练期间使用(无论如何,它在训练期间没有意义,因为在训练期间只使用预测的类概率,而不是硬类(。

事实上,几年前我们已经在一个玩具项目中实现了这样一个后处理模块,这是一个从图像中对狗比赛进行分类的在线服务:当模型返回的最大概率小于阈值时(例如,当模型呈现猫而不是狗的图像时(,就是这种情况(, 系统被编程为回答">你确定这是一只狗"的问题?,而不是被迫在预定义的狗种族中做出预测......

阈值用于二元分类或多标签分类,在多类分类的情况下你使用argmax,基本上激活度最高的类是你的输出类,所有类很少相等,如果模型训练得很好,应该有一个主导类

最新更新