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