refで説明されているように、keras で一般化されたサイコロ損失 (サイコロ損失のマルチクラス バージョン) を実装しました。
(私のターゲットは次のように定義されています: (batch_size, image_dim1, image_dim2, image_dim3, nb_of_classes))
def generalized_dice_loss_w(y_true, y_pred):
# Compute weights: "the contribution of each label is corrected by the inverse of its volume"
Ncl = y_pred.shape[-1]
w = np.zeros((Ncl,))
for l in range(0,Ncl): w[l] = np.sum( np.asarray(y_true[:,:,:,:,l]==1,np.int8) )
w = 1/(w**2+0.00001)
# Compute gen dice coef:
numerator = y_true*y_pred
numerator = w*K.sum(numerator,(0,1,2,3))
numerator = K.sum(numerator)
denominator = y_true+y_pred
denominator = w*K.sum(denominator,(0,1,2,3))
denominator = K.sum(denominator)
gen_dice_coef = numerator/denominator
return 1-2*gen_dice_coef
しかし、何かが間違っているに違いありません。私は 4 つのクラス (1 つのバックグラウンド クラスと 3 つのオブジェクト クラス、私は不均衡なデータセットを持っています) にセグメント化する必要がある 3D 画像を扱っています。最初の奇妙なこと: トレーニング中に列車の損失と精度が向上する (そして非常に速く収束する) 一方で、検証の損失と精度は一定のトラフ エポックです (画像を参照)。次に、テスト データを予測する場合、バックグラウンド クラスのみが予測されます。一定のボリュームが得られます。
まったく同じデータとスクリプトを使用しましたが、カテゴリカル クロス エントロピー損失があり、もっともらしい結果が得られました (オブジェクト クラスはセグメント化されています)。これは、私の実装に何か問題があることを意味します。それが何であるかについて何か考えはありますか?
さらに、最近のほとんどのセマンティック セグメンテーション タスク (少なくとも医用画像コミュニティ) で使用されているように見えるため、一般化されたサイコロ損失の実装を持つことは keras コミュニティにとって役立つと思います。
PS: 重みがどのように定義されているかは奇妙に思えます。10^-10前後の値が得られます。他の誰かがこれを実装しようとしましたか? また、重みなしで関数をテストしましたが、同じ問題が発生します。