使用TensorFlow进行稀疏标签的多标签图像分类?

10
我希望执行一个n类的多标签图像分类任务。对于每个图像,我都有稀疏的标签向量,每个标签向量的每个维度目前都是这样编码的:
1.0 -> 标签为真 / 图像属于这个类
-1.0 -> 标签为假 / 图像不包含在这个类中
0.0 -> 缺失值/标签
例如:V = {1.0,-1.0,1.0,0.0}。对于此示例V,模型应该学习到相应的图像应该被分类为第一和第三类。
我的问题是如何处理缺失的值/标签。我已经在问题中搜索到了这个问题:tensorflow/skflow#113 found here 所以可以使用tf.nn.sigmoid_cross_entropy_with_logits(logits, targets, name=None)进行多标签图像分类,
但是TensorFlow还有一个用于排他性分类的稀疏softmax的错误函数:
tf.nn.sparse_softmax_cross_entropy_with_logits(logits, labels, name=None)

那么有类似于稀疏sigmoid交叉熵的东西吗?(找不到相关内容)或者有什么建议可以处理我的多标签分类问题,其中标签是稀疏的。


我看了你在问题中提到的问题(tensor flow/skflow#113,可以在这里找到)。帖子结束得相当不确定。但是,我以前做过多标签分类,并使用tf.sigmoid_cross_entropy_with_logits()函数进行了处理。但我不确定为什么你需要-1.0?以及你所说的缺失值是什么意思。这个-1可能会对求解sigmoid交叉熵的梯度产生很多影响。 - Kashyap
3个回答

2
我使用带有正权重的weighted_cross_entropy_with_logits作为损失函数来处理1的情况。在我的情况中,所有标签的重要性都是相同的,但是0比1更有可能出现在任何标签的值中。因此,我通过调用上述损失函数的pos_weight参数来加权所有的1。我使用了一个pos_weight(即正值的权重)为10。顺便说一下,我不建议使用任何策略来计算pos_weight。我认为这将明确取决于手头的数据。
如果真实标签为1,则weighted_cross_entropy = pos_weight * sigmoid_cross_entropy
带有logits的加权交叉熵与sigmoid交叉熵相同,只是对所有具有正实际值(即1)的目标乘以额外的权重值。
理论上,它应该能够完成工作。我仍在调整其他参数以优化性能。稍后将更新性能统计信息。

0

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

其次,我认为您以这种方式表示数据是错误的。您有不相关的信息,试图在同一维度上表示它们。(如果是假或真,它会起作用)

对我来说更好的方法是为每个类别表示一个概率,即它是好的、缺失的还是错误的。

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


Sigmoid 只适用于二元分类。 - rAyyy

0

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

因此,我认为你应该绝对使用tf.sigmoid_cross_entropy_with_logits()

只需将缺失数据的目标更改为0.5。(0代表false,1代表true)。 我从未尝试过这种方法,但它应该能让你的网络学习而不会使它产生太大的偏差。


这在稀疏数据方面效果不佳。损失下降得很好,但准确性为零,因为它擅长预测哪些标签/类别不存在,而不是存在的标签/类别。假阴性。 - rusty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接