3

我正在使用完全卷积神经网络进行图像分割(论文链接):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。

将权重添加到课程中的最简单方法是什么?本质上,与其他三个应该具有正常体重 1 的班级相比,我希望班级 0 的权重非常低(例如 0.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)

其中权重是火炬张量 [0.1, 1, 1, 1]

谢谢!

4

1 回答 1

1

您的猜测是正确的,其中的weights参数tf.losses.softmax_cross_entropytf.losses.sparse_softmax_cross_entropy表示整个批次的权重,即使某些输入示例比其他示例更重要。没有开箱即用的方法来衡量跨的损失。

作为一种解决方法,您可以做的是根据当前标签专门选择权重并将它们用作批次权重。这意味着每个批次的权重向量会有所不同,但会尝试使偶尔的稀有类更加重要。请参阅此问题中的示例代码。

注意:由于批次不一定包含均匀的类分布,所以这个技巧在小批量时效果不佳,而在大批量时效果更好。当batch size为1时,完全没用。因此,使批次尽可能大。

于 2017-11-11T15:03:16.900 回答