2017-07-20 72 views
1

我使用完全卷积神经网络(链接到纸)做图像分割:https://people.eecs.berkeley.edu/~jonlong/long_shelhamer_fcn.pdfTensorflow:加权稀疏SOFTMAX与交叉熵损失

这可以被认为是像素分类(用于最终的每个像素获得一个标签)

我正在使用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]

谢谢!

+0

我认为它主要是在[这个问题](https://stackoverflow.com/questions/44560549/unbalanced-data-and-weighted-cross-entropy/44563055),只是用交叉熵替换稀疏交叉熵。 – user1735003

回答

1

你的猜测是正确的,在tf.losses.softmax_cross_entropytf.losses.sparse_softmax_cross_entropyweights参数意味着整个一批,即权重做出一些输入例子比其他人更重要。在中没有现成的方法来减轻损失。

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

注意:由于批次不一定包含统一的类别分布,因此这种方法对于小批量处理效果不佳,对于较大的批量处理效果会更好。批量大小为1时,它完全没用。因此,尽可能地使批次尽可能大。