完全な畳み込みニューラル ネットワークを使用して画像のセグメンテーションを行っています (論文へのリンク): 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")))
すべてがうまくいっています。しかし、1 つのクラスが大部分のピクセル (95% 以上) で発生することがわかりました。これをクラス 0 と呼びます。別の 3 つのクラス、1、2、および 3 があるとします。
クラスに重みを付ける最も簡単な方法は何ですか? 基本的に、通常の重み 1 を持つべき他の 3 つのクラスと比較して、クラス 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] です。
ありがとう!