web-dev-qa-db-fra.com

Sortie multiple Keras: fonction de perte personnalisée

J'utilise un modèle à sorties multiples en keras

model1 = Model(input=x, output=[y2,y3])

model1.compile((optimizer='sgd', loss=cutom_loss_function)

mon custom_loss_function est;

def custom_loss(y_true, y_pred):
   y2_pred = y_pred[0]
   y2_true = y_true[0]

   loss = K.mean(K.square(y2_true - y2_pred), axis=-1)
   return loss

Je veux seulement former le réseau sur la sortie y2.

Quelle est la forme/structure du y_pred et y_true argument dans la fonction de perte lorsque plusieurs sorties sont utilisées? Puis-je y accéder comme ci-dessus? Est-ce y_pred[0] ou y_pred[:,0]?

16
shaaa

Je veux seulement former le réseau sur la sortie y2.

Basé sur Keras Functional API Guide vous pouvez y parvenir avec

model1 = Model(input=x, output=[y2,y3])   
model1.compile(optimizer='sgd', loss=custom_loss_function,
                  loss_weights=[1., 0.0])

Quelle est la forme/structure des arguments y_pred et y_true dans la fonction de perte lorsque plusieurs sorties sont utilisées? Puis-je y accéder comme ci-dessus? Est-ce y_pred [0] ou y_pred [:, 0]

Dans les modèles à sorties multiples keras, la fonction de perte est appliquée séparément pour chaque sortie. En pseudo-code:

loss = sum( [ loss_function( output_true, output_pred ) for ( output_true, output_pred ) in Zip( outputs_data, outputs_model ) ] )

La fonctionnalité de fonction de perte sur plusieurs sorties ne me semble pas disponible. On pourrait probablement y parvenir en incorporant la fonction de perte en tant que couche du réseau.

16
Sharapolas

La réponse de Sharapolas est juste.

Cependant, il existe un meilleur moyen que d'utiliser une couche pour créer des fonctions de perte personnalisées avec une interdépendance complexe de plusieurs sorties d'un modèle.

La méthode que je connais est utilisée dans la pratique est de ne jamais appeler model.compile Mais seulement model._make_predict_function(). À partir de là, vous pouvez continuer et créer une méthode d'optimisation personnalisée en appelant model.output. Cela vous donnera toutes les sorties, [y2, y3] dans votre cas. Lorsque vous faites votre magie avec lui, obtenez un keras.optimizer Et utilisez sa méthode get_update en utilisant votre model.trainable_weights et votre perte. Enfin, renvoyez un keras.function Avec une liste des entrées requises (dans votre cas uniquement model.input) Et les mises à jour que vous venez de recevoir de l'appel optimizer.get_update. Cette fonction remplace désormais model.fit.

Ce qui précède est souvent utilisé dans les algorithmes PolicyGradient, comme A3C ou PPO. Voici un exemple de ce que j'ai essayé d'expliquer: https://github.com/Hyeokreal/Actor-Critic-Continuous-Keras/blob/master/a2c_continuous.py Regardez les méthodes build_model et crit_optimizer et lire la documentation de kreas.backend.function pour comprendre ce qui se passe.

J'ai trouvé que cette façon d'avoir fréquemment des problèmes avec la gestion de session et ne semble pas fonctionner du tout dans les keras tf-2.0 actuellement. Par conséquent, si quelqu'un connaît une méthode, faites-le moi savoir. Je suis venu ici en chercher un :)

0
Nric