web-dev-qa-db-fra.com

Débogage des valeurs de tenseurs keras

J'implémente sa propre fonction de perte de keras. Comment puis-je accéder aux valeurs de tenseur?

Ce que j'ai essayé

def loss_fn(y_true, y_pred):
    print y_true

Il imprime

Tensor("target:0", shape=(?, ?), dtype=float32)

Existe-t-il une fonction keras pour accéder à y_true values?

11
ronroo

En général, y_true vous le savez à l'avance - lors de la préparation de vos corpus de train ...

Cependant, il existe une astuce pour voir les valeurs dans y_true et/ou y_pred. Keras vous donne la possibilité d'écrire callback respectif pour imprimer la sortie du réseau de neurones . Elle ressemblera à ceci:

def loss_fn(y_true, y_pred):
    return y_true # or y_pred
...
import keras.callbacks as cbks
class CustomMetrics(cbks.Callback):

    def on_Epoch_end(self, Epoch, logs=None):
        for k in logs:
            if k.endswith('loss_fn'):
               print logs[k]

Ici, le loss_fn est le nom de votre fonction de perte lorsque vous le passez à la fonction model.compile(...,metrics=[loss_fn],) lors de la compilation du modèle.

Donc, finalement, vous devez passer ce callback CustomMetrics comme argument dans la model.fit():

model.fit(x=train_X, y=train_Y, ... , callbacks=[CustomMetrics()])

P.S .: Si vous utilisez Theano (ou TensorFlow) comme ici dans Keras, vous écrivez un programme python, puis vous le compilez et l'exécutez. Ainsi, dans votre exemple, y_true - n’est qu’une variable tenseur utilisée pour la compilation ultérieure et le comptage des fonctions de perte.

Cela signifie qu'il n'y a aucun moyen de voir les valeurs qu'il contient. Dans Theano, par exemple, vous pouvez regarder à l'intérieur de la seule variable dite partagée après l'exécution de la fonction eval() correspondante. Voir cette question pour plus d'informations. 

5
Igor Poletaev

Si vous utilisez les keras de TensorFlow, vous pouvez activer Eager Execution :

import tensorflow as tf 
tf.enable_eager_execution()

Ensuite, vous pouvez imprimer les tenseurs dans votre fonction de perte.

Si vous obtenez le message d'erreur "ValueError: seuls les optimiseurs natifs TF sont pris en charge en mode Eager". et vous avez utilisé 'adam' comme optimiseur, par exemple, vous pouvez modifier les arguments de compilation du modèle en

model.compile(optimizer = tf.train.AdamOptimizer(), loss = loss_fn, ...)
0
F1refly

Vous ne pouvez pas obtenir directement les valeurs de la variable symbolique tenseur. Vous devez écrire une fonction theano pour extraire la valeur. N'oubliez pas de choisir Theano comme backend de Keras.

Vérifiez le lien du cahier pour obtenir des données de base sur les variables et les fonctions: obtenir la valeur du tenseur dans la fonction d’appel de ses propres couches

0

J'utilise

print("y_true = " + str(y_true.eval()))

pour le débogage.

0
Peter Svehla