Tensorflow 和 Keras 预测阈值

aba*_*arc 5 classification machine-learning keras tensorflow

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

例如,假设我有 3 个类0, 1, 2,图像的标签是 one-hot 编码的,如下所示:[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 在没有类别预测高于该阈值的情况下表示预测是错误的?

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

des*_*aut 8

当模型在 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-class 设置中,相应的“特殊”值为1/n(此处为 0.33),并且根据定义,概率向量中总会一些条目大于或等于该值。

如果所有预测都低于 0.5,就像[0.33, 0.33, 0.33]TF 所说的结果一样怎么办?

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

现在,如果所有概率恰好相等如您所示的示例(尽管在实践中极不可能,但问题是有效的,至少在理论上),理想情况下,这种关系应该随机解决(即随机选择一个类) );在实践中,由于通常这个阶段是通过argmaxNumpy 的方法来处理的,因此预测将是第一类(即 class 0),这不难证明:

import numpy as np
x = np.array([0.33, 0.33, 0.33])
np.argmax(x)
# 0
Run Code Online (Sandbox Code Playgroud)

由于 Numpy 处理此类情况的方式 - 来自argmax文档

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

对于你的下一个问题:

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

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

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