Python Tensorflow和Keras如何从一个热编码输出到类预测,以计算精度?

Python Tensorflow和Keras如何从一个热编码输出到类预测,以计算精度?,python,tensorflow,machine-learning,keras,Python,Tensorflow,Machine Learning,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这将是默认的选择在这里。但它可能与其他激活功能 现在这里是提取并作为预测的最大数字吗?那么,

我想知道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这将是默认的选择在这里。但它可能与其他激活功能

现在这里是提取并作为预测的最大数字吗?那么,什么是错误的预测呢

例3:

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

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

如果我前面的假设是正确的,那么规则如下

每一个小于0.5的数字在预测方面都是0,从大于0.5或等于0.5的数字中,我选择最大的一个。最大的一个代表预测的类


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

在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]
[0, 1, 0]
例2

[0.6, 2, 0.1]
将是

[0, 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

你的问题有几个问题

首先,我们必须澄清确切的设置;因此,在单标签多类别分类中,即一个样本可以属于一个且仅属于一个类别,且具有一个热编码样本和预测,此处显示的所有示例都是无效的:输出数组的元素不仅小于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。当然,您可以在最后一层中要求线性或甚至relu激活;您的程序不会崩溃,但这并不意味着您正在从建模角度做任何有意义的事情,我相信这正是您真正感兴趣的

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


这是一个完全不同的上下文,称为多标签多类别分类,即一个样本可以属于多个类别。现在应该很清楚,像[1,0,1]这样的结果永远不会出现在单标签多类情况下,也就是说,如果您的真实标签中还没有这样的情况。请参阅以了解一般情况,并提示:使用sigmoid。

非常感谢您的回答!我还有一个问题:因此,如果您还有像[0,0,0]这样的输出,但没有正确的classifi,则无法使用精度
阳离子?Argmax总是会给你一个最高值的指数,所以不。@LukasNießen这个问题纯粹是学术性的;如果你已经正确设置了你的多类问题,你永远不会有这样的输出。非常感谢你,这真的帮助了我很多!事实上,我在想最后一层的激活函数,比如线性函数,只是为了理解精度的工作方式,尽管这没有意义。然而,我现在假设,在二进制分类中,0.5是重要的,因为如果输出较少,那么它在分类术语中是0,否则是1。很高兴知道,0.5的处理只在二进制分类中进行,我不知道单标签、多标签、二进制等之间的区别。无论如何,我现在知道了,非常感谢。@LukasNießen,非常欢迎您;正如您将看到的,在多标签的情况下,0.5可能会再次发现一些特殊的重要性,但我不得不在某个时候结束答案。