Tensorflow & Keras 预测阈值

TensorFlow 默认使用什么阈值来将输入图像分类为特定类别?

例如,假设我有三个类别 012,图像的标签是这样的独热编码:[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(或任何其他使用的框架)以及模型本身的,并且只能在推理期间使用,而不能在训练期间使用(在任何情况下,训练期间都没有意义,因为训练期间只使用预测的类别概率,而不使用硬类别)。

事实上,我们几年前在玩具项目中实现了这样的后处理模块,该项目是一个在线服务,用于从图像中分类狗的品种:当模型返回的最大概率低于某个阈值时(例如,当模型被展示了一张猫的图像而不是狗时),系统被编程为以“你确定这是狗吗?”的问题来响应,而不是被迫在预定义的狗品种中做出预测…

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注