Python Keras中具有二元分类的多标签

Python Keras中具有二元分类的多标签,python,keras,neural-network,multilabel-classification,Python,Keras,Neural Network,Multilabel Classification,目前,我正在使用Keras、sci工具包学习等进行图像分类 我会尽力解释所有的问题。 就像我之前说的,这是一个多标签的图像分类。 我的数据框包含4000个微观油样,标签代表当前样品中的一些颗粒。我将在下面举一个例子 数据框中的所有图像都有标签。想象一下,每个图像都包含一个包含13个值的数组,已经是二进制的,当然,1表示正,0表示负 e、 g 这意味着对于每个图像,可能有多个输出,在这种情况下,目标是给CNN一个油样,这可以返回图像中存在的颗粒 我不知道这是否足够清楚,抱歉,现在我要解释我真正的问

目前,我正在使用Keras、sci工具包学习等进行图像分类

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

数据框中的所有图像都有标签。想象一下,每个图像都包含一个包含13个值的数组,已经是二进制的,当然,1表示正,0表示负

e、 g

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

我不知道这是否足够清楚,抱歉,现在我要解释我真正的问题

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

Y predicted (sample 14): 3
Y predicted (sample 65): 11
我需要获得具有多个输出的预测,如:

Y predicted (sample 14): 3, 7, 9, 12
Y predicted (sample 65): 5, 8, 9, 11
我需要帮助来解决这个问题,因为我一直在努力。如果有人知道这方面的策略,我将不胜感激


提前谢谢

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

给定预测向量,可以通过应用阈值来获得单个类:

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

print(classes)
执行此操作后,您将得到一个具有不同类的可变大小的向量,正如模型所预测的那样。阈值(thresh)是一个参数,您必须使用应用于每个类的二进制分类的性能指标进行调整。每个类也可以有不同的阈值


阈值是您必须调整的内容。现在你将得到一个0和1的向量,其中0在你的问题中称为多标签分类。这意味着模型输出中一次可以存在多个类,而不仅仅是一个

给定预测向量,可以通过应用阈值来获得单个类:

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

print(classes)
执行此操作后,您将得到一个具有不同类的可变大小的向量,正如模型所预测的那样。阈值(thresh)是一个参数,您必须使用应用于每个类的二进制分类的性能指标进行调整。每个类也可以有不同的阈值


阈值是您必须调整的内容。现在你将得到一个0和1的向量,其中0在

中,你能提供模型摘要吗?@Pusheen_the_dev是的抱歉如果有点混乱,我只是测试了一些conv和MaxPooling。但即使有了这些变化,我也没有得到预期的结果,我有点迷失了方向。你用什么作为损失?你是如何做出预测的?使用二进制交叉熵。。。对于使用“predict_classes”的预测,我已经只使用了predict。错误是使用了“predict_classes”,如果我记得清楚的话,它会返回出现最大值的索引。你应该使用“预测”。您应该将您的损失更改为mae或MSE。您可以提供模型摘要吗?@Pusheen_the_dev是的,如果有点混乱,我只是测试了一些conv和MaxPooling。但即使有了这些变化,我也没有得到预期的结果,我有点迷失了方向。你用什么作为损失?你是如何做出预测的?使用二进制交叉熵。。。对于使用“predict_classes”的预测,我已经只使用了predict。错误是使用了“predict_classes”,如果我记得清楚的话,它会返回出现最大值的索引。你应该使用“预测”。你应该把你的损失转给mae或MSE,我认为这是可行的。进行一些测试,例如,Y pred:是否可以将输出转换为0或1?我将阈值设置为0。5@AlexColombari为此,只需做一些列表。append(int(prob>thresh))感谢您的帮助。另一个问题,我试图在我的项目中应用compute_class_weight,但由于多标签分类,没有成功。我用Dict找到了一些答案,但我的问题中没有。你知道我的案子有什么策略吗?谢谢我想这就是工作。进行一些测试,例如,Y pred:是否可以将输出转换为0或1?我将阈值设置为0。5@AlexColombari为此,只需做一些列表。append(int(prob>thresh))感谢您的帮助。另一个问题,我试图在我的项目中应用compute_class_weight,但由于多标签分类,没有成功。我用Dict找到了一些答案,但我的问题中没有。你知道我的案子有什么策略吗?谢谢