Ich implementiere eine eigene Kerasverlustfunktion. Wie kann ich auf Tensorwerte zugreifen?
Was ich versucht habe
def loss_fn(y_true, y_pred):
print y_true
Es druckt
Tensor("target:0", shape=(?, ?), dtype=float32)
Gibt es eine Keras-Funktion für den Zugriff auf y_true -Werte?
Keras 'Backend hat print_tensor
, mit dem Sie dies tun können. Sie können es so verwenden:
import keras.backend as K
def loss_fn(y_true, y_pred):
y_true = K.print_tensor(y_true, message='y_true = ')
y_pred = K.print_tensor(y_pred, message='y_pred = ')
...
Die Funktion gibt einen identischen Tensor zurück. Wenn dieser Tensor ausgewertet wird, druckt er seinen Inhalt vor message
. Aus den Keras-Dokumenten :
Beachten Sie, dass print_tensor einen neuen Tensor zurückgibt, der mit x identisch ist. Andernfalls wird der Druckvorgang bei der Auswertung nicht berücksichtigt.
Stellen Sie daher sicher, dass Sie den Tensor danach verwenden.
Normalerweise wissen Sie y_true
im Voraus - während der Vorbereitung Ihres Zugkorpus ...
Es gibt jedoch einen Trick, um die Werte in y_true
und/oder y_pred
zu sehen. Keras gibt Ihnen die Möglichkeit, entsprechende callback zu schreiben, um die Ausgabe des neuronalen Netzwerks zu drucken ..__ Es sieht etwa so aus:
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]
Hier ist der loss_fn
der Name Ihrer Verlustfunktion, wenn Sie diese während der Kompilierung des Modells in die model.compile(...,metrics=[loss_fn],)
-Funktion übergeben.
Schließlich müssen Sie dieses CustomMetrics
callback als Argument an model.fit()
übergeben:
model.fit(x=train_X, y=train_Y, ... , callbacks=[CustomMetrics()])
P .: Wenn Sie Theano (oder TensorFlow) wie hier in Keras verwenden, schreiben Sie ein Python-Programm, kompilieren es und führen es aus. In Ihrem Beispiel ist y_true
- nur eine Tensorvariable, die zur weiteren Kompilierung und zum Zählen von Funktionsverlusten verwendet wird.
Das bedeutet, dass es keine Möglichkeit gibt, die Werte darin zu sehen. In Theano können Sie beispielsweise nach der Ausführung der jeweiligen eval()
-Funktion nur in die sogenannte Shared-Variable schauen. Siehe diese Frage für weitere Informationen.
Sie können Ihre Verlustfunktion neu definieren, um stattdessen den Wert zurückzugeben:
def loss_fn(y_true, y_pred):
return y_true
Lassen Sie uns einige Tensoren erstellen:
from keras import backend as K
a = K.constant([1,2,3])
b = K.constant([4,5,6])
Und verwenden Sie die keras.backend.eval()
API, um Ihre Verlustfunktion zu bewerten:
loss = loss_fn(a,b)
K.eval(loss)
# array([1., 2., 3.], dtype=float32)
Wenn Sie die Keras von TensorFlow verwenden, können Sie Eager Execution aktivieren:
import tensorflow as tf
tf.enable_eager_execution()
Anschließend können Sie die Tensoren in Ihrer Verlustfunktion drucken.
Falls Sie die Fehlermeldung "ValueError: Nur native TF-Optimierer werden im Eager-Modus unterstützt" erhalten. Sie haben 'adam' beispielsweise als Optimierer verwendet. Sie können die Kompilierungsargumente des Modells in ändern
model.compile(optimizer = tf.train.AdamOptimizer(), loss = loss_fn, ...)
Sie können die Werte nicht direkt von der symbolischen Tensorvariablen abrufen. Sie müssen eine Theano-Funktion schreiben, um den Wert zu extrahieren. Vergiss nicht, Theano als Backend von Keras zu wählen.
Überprüfen Sie den Notebook-Link, um einige grundlegende Informationen zu den Variablen und Funktionen von Aneano zu erhalten: Tensorwert in Aufruffunktion der eigenen Layer abrufen
Ich benutze
print("y_true = " + str(y_true.eval()))
zum debuggen.