Keras中具有二进制分类的多标签

时间:2019-02-20 16:26:03

标签: python keras neural-network multilabel-classification

此刻,我正在使用Keras,sci-kit学习等进行图像分类。

我将尝试解释所有问题。 就像我之前说的,这是带有多标签的图像分类。 我的数据框包含4000个微观油样,标签表示当前样品中的一些颗粒。我将在下面举一个例子。

好吧,数据帧中的所有图像都被标记了。想象一下,每个图像包含一个具有13个值的数组,这些值已经是二进制的,当然,正数为1,负数为0。

例如

@"VEN.*(?=\\)"

这意味着对于每个图像,可能会有多个输出,在这种情况下,目标是将一个油样提供给CNN,并且可以返回图像中存在的颗粒。

我不知道是否足够清楚,对不起,现在我将解释我的真正问题。

在我的CNN中,我已经将输出层设置为13(紧随每个图像中的标签数量之后)。 我不知道为什么,但是当我训练模型时,预测的Y仅返回一个值,例如:

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

我需要获得具有多个输出的谓词,例如:

Y predicted (sample 14): 3
Y predicted (sample 65): 11

我需要帮助来解决此问题,因为我坚持了很长时间。如果有人知道此策略,我将不胜感激。

谢谢!

1 个答案:

答案 0 :(得分:2)

您的问题称为多标签分类。这意味着一次可以在模型输出中出现多个类别,而不仅仅是一个类别。

给出预测向量,您可以通过应用阈值来获得各个类别:

thresh = 0.5
p = model.predict(some_input)
classes = []
for prob, idx in enumerate(p):
    if prob > thresh:
        classes.append(idx)

print(classes)

执行此操作后,您将获得模型所预测的具有不同类的可变大小向量。阈值(阈值)是您必须使用应用于每个类的二进制分类的性能指标来调整的参数。您也可以为每个课程设置不同的阈值。

您必须调整阈值。现在您将获得一个0和1的向量,其中

中的0