web-dev-qa-db-de.com

Fehlerbehebung bei Keras-Tensorwerten

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?

11
ronroo

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.

8
nroulet

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. 

5
Igor Poletaev

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)
1
Raimi bin Karim

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, ...)
0
F1refly

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

0

Ich benutze

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

zum debuggen.

0
Peter Svehla