我正在使用全卷积神经网络进行图像分割(链接到论文(: 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]( 所以形状 (4,( 和等级 1,而标签有形状(batch_size、宽度、高度(等等等级 3。我错过了什么吗?
PyTorch 上的等效项将是
torch.nn.CrossEntropyLoss(weight=None, size_average=True, ignore_index=-100)
其中权重是火炬张量 [0.1, 1, 1, 1]
谢谢!
你的猜测是正确的,tf.losses.softmax_cross_entropy
和tf.losses.sparse_softmax_cross_entropy
中的weights
参数表示整个批次的权重,即使一些输入示例比其他示例更重要。没有开箱即用的方法可以跨类权衡损失。
作为一种解决方法,您可以根据当前标签专门选择重量并将其用作批量重量。这意味着每个批次的权重向量将不同,但会尝试使偶尔的稀有类更加重要。请参阅此问题中的示例代码。
注意:由于批次不一定包含均匀的类分布,因此此技巧在小批量大小时效果不佳,而在较大的批量大小时效果更好。当批量大小为 1 时,它完全没用。因此,使批次尽可能大。