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?
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.
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, ...)
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
J'utilise
print("y_true = " + str(y_true.eval()))
pour le débogage.