こんにちは、私は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
Kerasでパラメーター化されたカスタム損失関数を実装するには、2つのステップがあります。最初に、係数/メトリックのメソッドを記述します。次に、Kerasが必要とする方法でフォーマットするラッパー関数を作成します。
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)
トリッキーな部分になりました。 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)