web-dev-qa-db-fra.com

Créer une fonction de perte personnalisée en keras

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
23
Subham Mukherjee

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.

  1. 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)
    
  2. 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)
65
T. Nair