Bonjour, j'ai essayé de créer une fonction de perte personnalisée dans keras pour dice_error_coefficient. Il a ses implémentations dans tensorboard et j'ai essayé d'utiliser la même fonction dans keras avec tensorflow mais il continue de renvoyer un NoneType quand j'ai utilisé model.train_on_batch ou model.fit où il donne les valeurs appropriées lorsqu'il est utilisé dans les métriques du modèle. S'il vous plaît quelqu'un peut m'aider avec ce que dois-je faire? J'ai essayé de suivre des bibliothèques telles que Keras-FCN de ahundt, où il a utilisé des fonctions de perte personnalisées, mais aucune ne semble fonctionner. La cible et la sortie dans le code sont y_true et y_pred respectivement, telles qu'utilisées dans le fichier loss.py dans keras.
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
Il existe deux étapes pour implémenter une fonction de perte personnalisée paramétrée dans Keras. Commencez par écrire une méthode pour le coefficient/métrique. Deuxièmement, écrire une fonction wrapper pour formater les choses comme Keras en a besoin.
En fait, utiliser le backend de Keras au lieu de tensorflow directement pour des fonctions de perte personnalisées simples comme DICE. Voici un exemple du coefficient implémenté de cette façon:
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)
Maintenant pour la partie la plus délicate. Les fonctions de perte de keras ne doivent prendre que (y_true, y_pred) en tant que paramètres. Nous avons donc besoin d’une fonction séparée qui renvoie une autre fonction.
def dice_loss(smooth, thresh):
def dice(y_true, y_pred)
return -dice_coef(y_true, y_pred, smooth, thresh)
return dice
Enfin, vous pouvez l’utiliser comme suit dans la compilation 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)