Tensorflow:带有交叉熵损失的加权稀疏softmax

4

我正在使用全卷积神经网络进行图像分割(论文链接):https://people.eecs.berkeley.edu/~jonlong/long_shelhamer_fcn.pdf

这可以被视为像素分类(最终每个像素都会获得一个标签)。

我正在使用tf.nn.sparse_softmax_cross_entropy_with_logits损失函数。

loss = tf.reduce_mean((tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits,
                                                                      labels=tf.squeeze(annotation, squeeze_dims=[3]),
                                                                      name="entropy"))) 

一切都进行得很顺利。然而,我发现其中一个类在绝大多数像素中出现(95%+),将其称为类0。我们假设有另外三个类,分别为1、2和3。
最简单的方法是如何给这些类加权?基本上,我想让类0的权重非常低(比如0.1),而其他三个类应该具有正常权重1。
我知道这个函数存在:https://www.tensorflow.org/api_docs/python/tf/losses/sparse_softmax_cross_entropy 但它看起来对我来说完全做了一些不同的事情,我不明白权重应该与标签具有相同的等级。我的意思是,在我的情况下,权重应该是类似于Tensor([0.1, 1, 1, 1])的形状为(4,)和等级1的东西,而标签具有形状(batch_size, width, height),因此等级为3。我有什么遗漏吗?
在PyTorch上的等效操作是什么?
torch.nn.CrossEntropyLoss(weight=None, size_average=True, ignore_index=-100)

其中 weight 是一个 torch 张量 [0.1, 1, 1, 1]

谢谢!


我认为这个问题在这个问题中已经被大部分解决了,只需要将交叉熵替换为稀疏交叉熵即可。 - P-Gn
1个回答

2
您猜测的是正确的,tf.losses.softmax_cross_entropytf.losses.sparse_softmax_cross_entropy中的weights参数表示跨批次的权重,即使某些输入示例比其他示例更重要。目前没有一种开箱即用的方法可以在类别之间加权损失。

作为解决方法,您可以根据当前标签特别选择权重,并将它们用作批量权重。这意味着每个批次的权重向量都将不同,但会尝试使偶尔出现的罕见类别更重要。请参见this question中的示例代码。

注意:由于批次不一定包含均匀的类分布,因此该技巧在小批量大小时效果较差,在大批量大小时效果更好。当批量大小为1时,完全无用。因此,请尽可能增大批次大小。


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