web-dev-qa-db-ja.com

ケラスでカスタム損失関数を作成する

こんにちは、私はdice_error_coefficientのケラでカスタム損失関数を作成しようとしています。その実装はtensorboardであり、テンソルフローでkerasで同じ関数を使用しようとしましたが、model.train_on_batchを使用したときにNoneTypeを返し続けますまたはmodel.fitここで、モデルのメトリックで使用されたときに適切な値が得られます。誰かが私が何をすべきかを助けてくれますか?私はahundtがKeras-FCNのようなライブラリを試してみました。彼はカスタム損失関数を使用しましたが、どれも機能していないようです。コードのターゲットと出力は、kerasのloss.pyファイルで使用されるy_trueとy_predです。

def dice_hard_coe(target, output, threshold=0.5, axis=[1,2], smooth=1e-5):
    """References
    -----------
    - `Wiki-Dice <https://en.wikipedia.org/wiki/Sørensen–Dice_coefficient>`_
    """

    output = tf.cast(output > threshold, dtype=tf.float32)
    target = tf.cast(target > threshold, dtype=tf.float32)
    inse = tf.reduce_sum(tf.multiply(output, target), axis=axis)
    l = tf.reduce_sum(output, axis=axis)
    r = tf.reduce_sum(target, axis=axis)
    hard_dice = (2. * inse + smooth) / (l + r + smooth)
    hard_dice = tf.reduce_mean(hard_dice)
    return hard_dice
23

Kerasでパラメーター化されたカスタム損失関数を実装するには、2つのステップがあります。最初に、係数/メトリックのメソッドを記述します。次に、Kerasが必要とする方法でフォーマットするラッパー関数を作成します。

  1. DICEのような単純なカスタム損失関数に対して、テンソルフローの代わりにKerasバックエンドを直接使用することは、実際にはかなりきれいです。そのように実装された係数の例を次に示します。

    import keras.backend as K
    def dice_coef(y_true, y_pred, smooth, thresh):
        y_pred = y_pred > thresh
        y_true_f = K.flatten(y_true)
        y_pred_f = K.flatten(y_pred)
        intersection = K.sum(y_true_f * y_pred_f)
    
        return (2. * intersection + smooth) / (K.sum(y_true_f) + K.sum(y_pred_f) + smooth)
    
  2. トリッキーな部分になりました。 Keras損失関数は、パラメーターとして(y_true、y_pred)のみを取ります。したがって、別の関数を返す別の関数が必要です。

    def dice_loss(smooth, thresh):
      def dice(y_true, y_pred)
        return -dice_coef(y_true, y_pred, smooth, thresh)
      return dice
    

最後に、Kerasコンパイルで次のように使用できます。

# build model 
model = my_model()
# get the loss function
model_dice = dice_loss(smooth=1e-5, thresh=0.5)
# compile model
model.compile(loss=model_dice)
65
T. Nair