10

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前後の値が得られます。他の誰かがこれを実装しようとしましたか? また、重みなしで関数をテストしましたが、同じ問題が発生します。

4

1 に答える 1