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中具有稀疏标签的多标签图像分类?的主要内容,如果未能解决你的问题,请参考以下文章
尽管对稀疏目标使用稀疏分类熵,但 Logits 和标签必须具有相同的第一维误差