我想知道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