【问题标题】:Multilabel with binary classification in KerasKeras中具有二进制分类的多标签
【发布时间】:2019-07-14 10:04:16
【问题描述】:

目前,我正在使用 Keras、sci-kit learn 等进行图像分类。

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

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

例如

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

这意味着对于每张图像,可以有多个输出,在这种情况下,目标是给 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

我需要帮助来解决这个问题,因为我尝试了很长时间。如果有人知道这方面的策略,我将不胜感激。

提前致谢!

【问题讨论】:

  • 能否提供模型摘要?
  • @Pusheen_the_dev 是的pastebin.com/raw/nJputnuE 抱歉,如果有点乱,我只是测试了一些 Convs 和 MaxPooling。但是即使进行了更改,我也没有得到预期的结果,我有点失落
  • 谢谢。你用什么作为损失?你是如何做出预测的?
  • 使用二元交叉熵...对于我使用“predict_classes”的预测,我也已经只使用了预测。
  • 错误是使用了“predict_classes”,如果我没记错的话,它会返回出现最大值的索引。你应该使用“预测”。你应该把你的损失改成mae或mse

标签: python keras neural-network multilabel-classification


【解决方案1】:

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

给定预测的矢量,您可以通过应用阈值处理来获得单个类:

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

print(classes)

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

阈值是您必须调整的东西。现在,您将获得0s和1s的向量,其中0在

【讨论】:

  • 我认为这是工作。进行一些测试,我得到了例如,y pred:pastebin.com/raw/kDy12pvv它是可以将该out转换为0或1的?我设置了0.5 span>的阈值
  • @ AlexColombari,用于刚执行某些_list.append(int(prob> thresh)) span>
  • 感谢您的帮助。另一个问题,我试图在我的项目中应用compute_class_puight,但没有成功,因为多标签分类。我使用i.e. dict找到一些答案,但在我的问题中没有运行。你知道我案件的任何策略吗?谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-07
  • 2018-06-23
  • 2022-09-23
  • 2022-01-23
  • 2019-10-12
  • 2020-09-26
  • 1970-01-01
相关资源
最近更新 更多