TensorFlow中具有稀疏标签的多标签图像分类?

Posted

技术标签:

【中文标题】TensorFlow中具有稀疏标签的多标签图像分类?【英文标题】:Multilabel image classification with sparse labels in TensorFlow? 【发布时间】:2017-02-03 11:10:09 【问题描述】:

我想为 n 个类别执行多标签图像分类任务。 我有每个图像的稀疏标签向量,每个标签向量的每个维度当前都以这种方式编码:

1.0 ->标签为真/图片属于这个类

-1.0 ->标签错误/图像不包含到此类。

0.0 ->缺失值/标签

例如:V= 1.0,-1.0,1.0, 0.0

对于这个示例 V,模型应该学习,相应的图像应该被分类为第一类和第三类。

我目前的问题是如何处理缺失的值/标签。我搜索了这些问题并发现了这个问题: 张量流/skflow#113 found here

因此可以使用以下方法进行多标签图像分类: tf.nn.sigmoid_cross_entropy_with_logits(logits, targets, name=None)

但是TensorFlow对于sparse softmax有这个误差函数,用于排他分类: tf.nn.sparse_softmax_cross_entropy_with_logits(logits, labels, name=None)

那么有没有像稀疏 sigmoid 交叉熵这样的东西? (找不到东西)或任何建议我如何处理稀疏标签的多标签分类问题。

【问题讨论】:

我解决了您在问题中提到的问题(张量流/skflow#113 发现 here)。这篇文章的结尾非常不确定。但是我之前已经完成了多标签分类,并为此使用了tf.sigmoid_cross_entropy_with_logits() 函数。但我不确定你为什么需要-1.0?以及您所说的缺失值是什么意思。这个 -1 对推导 sigmoid 交叉熵的梯度有很多影响 【参考方案1】:

首先我想知道您所说的缺失数据是什么意思?在您的情况下,miss 和 false 有什么区别?

接下来,我认为你这样表示你的数据是错误的。您尝试在同一维度上表示不相关的信息。 (如果它是假的或真的,它会起作用)

在我看来,更好的做法是为你的每个班级代表一个概率,如果它是好的,或者是缺失的还是错误的。

在你的情况下 V = [(1,0,0),(0,0,1),(1,0,0),(0,1,0)]

【讨论】:

Sigmoid 仅用于二分类。【参考方案2】:

好的! 所以你的问题更多是关于我认为如何处理丢失的数据。

所以我认为你绝对应该使用tf.sigmoid_cross_entropy_with_logits()

只需将缺失数据的目标更改为 0.5。 (0 为假,1 为真)。 我从未尝试过这种方法,但它应该让你的网络学习而不会有太多偏见。

【讨论】:

这不适用于稀疏数据。损失下降得很好,但准确度为零,因为它可以很好地预测哪些标签/类别不存在,而不是哪些标签/类别存在。假阴性。【参考方案3】:

我使用 weighted_cross_entropy_with_logits 作为损失函数,权重为 1s。

就我而言,所有标签都同样重要。但是 0 作为任何标签的值出现的可能性是 1 的十倍。

所以我通过调用上述损失函数的 pos_weight 参数来称重所有的 1。我使用了 10 的 pos_weight(= 正值的权重)。顺便说一下,我不推荐任何计算 pos_weight 的策略。我认为这将明确取决于手头的数据。

如果真实标签 = 1, weighted_cross_entropy = pos_weight * sigmoid_cross_entropy

带 logits 的加权交叉熵 与带 logits 的 Sigmoid 交叉熵 相同,只是额外的权重值乘以所有 目标一个正的实际值,即; 1.

理论上,它应该可以完成这项工作。我仍在调整其他参数以优化性能。稍后将更新性能统计信息。

【讨论】:

以上是关于TensorFlow中具有稀疏标签的多标签图像分类?的主要内容,如果未能解决你的问题,请参考以下文章

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

尽管对稀疏目标使用稀疏分类熵,但 Logits 和标签必须具有相同的第一维误差

在 TensorFlow 图像分类中获取标签

Keras 中具有类权重的多标签分类

使用 PyTorch 的多标签、多类图像分类器 (ConvNet)

Keras CNN:图像的多标签分类