Tensorflow和Keras预测阈值

6yoyoihd  于 2023-10-19  发布在  其他
关注(0)|答案(2)|浏览(139)

默认情况下,TF将输入图像分类为某个类别时使用的阈值是多少?
例如,假设我有3个类012,图像的标签是这样编码的:[1, 0, 0],表示此图像具有类别0的标签。
现在,当模型在softmax之后输出预测时,就像这样:[0.39, 0.56, 0.05] TF是否使用0.5作为阈值,所以它预测的类是类1?
如果所有的预测都小于0.5,比如[0.33, 0.33, 0.33],TF会说结果是什么?
有没有办法指定一个新的阈值,例如0.7,并确保TF说,如果没有类预测高于该阈值的预测是错误的?
这种逻辑是否也会延续到推理阶段,如果网络对类别不确定,那么它将拒绝给予图像的分类?

67up9zun

67up9zun1#

当模型在softmax之后输出预测时,如下所示:[0.39, 0.56, 0.05] TF是否使用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方法处理,因此预测将是第一类(即,class 0),这并不难证明:

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

由于Numpy如何处理此类情况-来自argmax docs
在多次出现最大值的情况下,返回与第一次出现对应的索引。
你的下一个问题:
有没有办法指定一个新阈值(例如0.7),并确保如果没有类别预测高于该阈值,则TF表示预测是错误的?
不是在Tensorflow(或任何其他框架)本身,但这总是可以在推理期间的 * 后处理 * 阶段完成的:不管你的分类器实际返回的是什么,总是可以添加一些额外的逻辑,这样每当最大概率值小于阈值时,你的 * 系统 (即,你的模型加上后处理逻辑)返回类似“I don 't know / I am not sure / I can 't answer"的内容。但同样,这是Tensorflow(或使用的任何其他框架)和模型本身的外部,它只能在推理过程中使用,而不能在训练过程中使用(在任何情况下,它在训练过程中都没有意义,因为在训练过程中只使用预测的类概率,而不是硬类)。
事实上,我们几年前在一个玩具项目中实现了这样一个后处理模块,这是一个在线服务,可以从图像中分类狗比赛:当模型返回的最大概率小于阈值时(例如,当模型呈现猫而不是狗的图像时),系统被编程为用问题“
你确定这是狗 *"来响应。,而不是被迫在预定义的赛狗中做出预测.

yvt65v4c

yvt65v4c2#

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

相关问题