Tensorflow和Keras如何从单热编码输出转变为用于计算精度的类预测?



我想知道TensorFlow/Keras中的精度指标如何计算给定输入是否与预期的预测匹配,或者换句话说,它如何确定预测的网络数量。


示例 1:

输出:[0, 0, 0.6], 预期输出:[0, 0, 1]

我假设 0.6 只是四舍五入为 1,对吗?或者它被视为唯一大于 0.5 的数字,因此它是预测的数字。

但是,如果是这样,请考虑示例 2:

输出:[0.6, 2, 0.1], 预期输出:[1, 0, 0]

我知道,这样的输出是不可能的softmax这将是这里的默认选择。但是使用其他激活函数也可以。

现在这里只是"提取"并作为预测的最大数字吗?所以2,那将是一个错误的预测。

例3:

输出:[0.1, 0, 0.2], 预期输出:[0, 0, 1]

由于输出中的每个数字都小于 0.5,我猜精度计算器会将此输出视为[0, 0, 0],因此也不是正确的预测。这是对的吗?


如果我前面的假设是正确的,那么规则会是这样的吗?

就预测而言,每个小于0.5的数字都是一个0,从大于0.5或等于0.5的数字中,我选择了最大的一个。然后,最大的一个表示预测的类。


如果是这样,那么准确性只能用于只有一个相应正确类的分类(例如,不可能有像[1, 0, 1]这样的预期输出)?

您的问题有几个问题。

首先,我们必须澄清确切的设置;因此,在具有独热编码样本(和预测)的单标签多类分类(即样本可以属于一个且仅属于一个类)中,您在此处显示的所有示例都是无效的:输出数组的元素不仅小于 1,而且它们必须加起来为 1(因为它们被视为概率)。

澄清了这一点之后,很容易看出不需要阈值到任何值(例如,正如您在此处建议的那样,阈值为 0.5);您只需采取argmax即可。所以,[0.25. 0.35. 0.4]变得[0, 0, 1].

从这个例子中,还应该很明显,在这样的设置中,可能存在没有单个元素大于 0.5 的情况,这是非常自然的。似乎新的从业者很容易混淆0.5在这里扮演一些特殊角色,因为它仅在二元分类中起作用;但在多类分类中,0.5不再起任何特殊作用;(单标签)多类设置中的等效"阈值"是1/n,其中n是类的数量(在这里的示例中为 0.33,因为我们有 3 个类)。很容易看出,给定数组元素应小于 1 且加起来为 1 的约束,总会有一个条目大于 0.33。但只需采用argmax就可以完成这项工作,而无需任何中间阈值。

我知道,这样的输出是不可能的softmax这将是这里的默认选择。但是使用其他激活函数也可以。

只要我们将讨论保持在有意义的分类设置上(而不仅仅是做一些疯狂的计算实验),这是不正确的;分类唯一可能的其他激活函数是sigmoid,它将再次给出小于 1 的结果(尽管没有更多的加起来是 1)。您当然可以在最后一层要求linear(甚至relu)激活;你的程序不会崩溃,但这并不意味着你正在从建模的角度做任何有意义的事情,我相信这是你在这里真正感兴趣的。

那么准确性只能用于只有一个相应正确类的分类(例如,不可能有像[1, 0, 1]这样的预期输出)?

这是一个完全不同的上下文,称为多标签多类分类(即样本可以属于多个类)。现在应该很清楚,在单标签多类案例的情况下(即,如果你的真实标签中没有这样的情况),像[1, 0, 1]这样的结果永远不会发生。请参阅多标签数据准确性的度量是什么?对于一般情况,以及 Keras 如何处理多标签分类?(提示:带sigmoid)。

默认情况下,Keras 使用的准确性是分类准确性,这似乎是适合您的情况。它计算多类分类问题的所有预测的平均准确率。

它的代码如下:

def categorical_accuracy(y_true, y_pred):
return K.mean(K.equal(K.argmax(y_true, axis=-1), K.argmax(y_pred, axis=-1)))

意思是示例 1

[0, 0, 0.6]

将是

[0, 0, 1]

例 2

[0.6, 2, 0.1]

将是

[0, 1, 0]

例 3

[0.1, 0, 0.2]

将是

[0, 0, 1]

然后将这些与目标进行比较

[0, 0, 1], [1, 0, 0], [0, 0, 1] 

如果你预测这三个例子会给出这些例子的平均值,那么你的准确性将是

0.66

最新更新