2017-03-13 6 views
1

Ich versuche, eine neue Verlustfunktion meiner eigenen zu implementieren. Wenn ich versuchte, es zu debuggen (oder in es zu drucken), habe ich bemerkt, dass es nur einmal bei der Modellerstellung des Codes aufgerufen wird.Benutzerdefinierte Verlustfunktion Implementierung

Wie kann ich wissen, was y_pred und y_true enthält (Formen, Daten etc ..), wenn ich meinen Code in diese Funktion ausführen kann, während das Modell passend?

Ich schrieb diese Verlustfunktion:

def my_loss(y_true, y_pred): 
    # run over the sequence, jump by 3 
    # calc the label 
    # if the label incorrect punish 

    y_pred = K.reshape(y_pred, (1, 88, 3)) 

    y_pred = K.argmax(y_pred, axis=1) 

    zero_count = K.sum(K.clip(y_pred, 0, 0)) 
    one_count = K.sum(K.clip(y_pred, 1, 1)) 
    two_count = K.sum(K.clip(y_pred, 2, 2)) 

    zero_punish = 1 - zero_count/K.count_params(y_true) 
    one_punish = 1- one_count/ K.count_params(y_true) 
    two_punish = 1- two_count/ K.count_params(y_true) 

    false_arr = K.not_equal(y_true, y_pred) 

    mask0 = K.equal(y_true, K.zeros_like(y_pred)) 
    mask0_miss = K.dot(false_arr, mask0) * zero_punish 

    mask1 = K.equal(y_true, K.ones_like(y_pred)) 
    mask1_miss = K.dot(false_arr, mask1) * one_punish 

    mask2 = K.equal(y_true, K.zeros_like(y_pred)+2) 
    mask2_miss = K.dot(false_arr, mask2) * two_punish 

    return K.sum(mask0_miss) + K.sum(mask1_miss) + K.sum(mask2_miss) 

Es scheitert an:

theano.gof.fg.MissingInputError: A variable that is an input to the graph was 
neither provided as an input to the function nor given a value. A chain of 
variables leading from this input to an output is [/dense_1_target, Shape.0]. 
This chain may not be unique 
Backtrace when the variable is created: 

Wie kann ich es beheben?

+1

konnten zeigen Sie die entsprechende Fehlfunktion Code, so dass wir etwas weiter zu gehen haben? Ihre Frage lautet im Moment: "Wie mache ich _A_ wenn _B_ nicht funktioniert?" anstelle von "wie bekomme ich _B_ wieder arbeiten?" –

Antwort

2

Sie müssen verstehen, dass Theano eine symbolische Sprache. Zum Beispiel, wenn wir die folgenden Verlustfunktion in Keras definieren:

def myLossFn(y_true, y_pred): 
    return K.mean(K.abs(y_pred - y_true), axis=-1) 

Theano ist nur eine symbolische Regel in einem Berechnungsgraphen zu machen, die ausgeführt werden würde, wenn es erhält Werte, dh wenn Sie das Modell mit einigen Mini-Zug Chargen.

Was Ihre Frage, wie Sie Ihr Modell geht zu debuggen, können Sie theano.function dafür. Jetzt möchten Sie wissen, ob Ihre Verlustberechnung korrekt ist. Du machst folgendes.

Sie können die Python/numpy Version Ihrer Verlustfunktion implementieren. Übergeben Sie zwei zufällige Vektoren an Ihre numpy-loss-Funktion und erhalten Sie eine Zahl. Um zu überprüfen, ob das Ergebnis nahezu identisch ist, definieren Sie etwas wie folgt.

import theano 
from theano import tensor as T 
from keras import backend as K 

Y_true = T.frow('Y_true') 
Y_pred = T.fcol('Y_pred') 
out = K.mean(K.abs(Y_pred - Y_true), axis=-1) 

f = theano.function([Y_true, Y_pred], out) 

# creating some values 
y_true = np.random.random((10,)) 
y_pred = np.random.random((10,)) 

numpy_loss_result = np.mean(np.abs(y_true-y_pred)) 
theano_loss_result = f(y_true, y_pred) 

# check if both are close enough 
print numpy_loss_result-theano_loss_result # should be less than 1e-5 

Grundsätzlich ist theano.function eine Möglichkeit, Werte zu setzen und diese symbolischen Ausdrücke auswerten. Ich hoffe das hilft.

+0

Mein Problem ist, wenn ich die Anpassung ausführen, die Verlustfunktionen nicht aufgerufen - oder kann ich es nicht sehen? –

+0

Sie können es nicht sehen. Vielleicht gibt es eine andere Möglichkeit zu debuggen, während man die Fit-Funktion ausführt, aber ich bevorzuge meinen Weg, den ich oben gesagt habe. Alternativ können Sie 'train_on_batch()' ausführen und meine Methode verwenden, um jeden Batch zu debuggen. –

+0

ok..das ist irgendwie merkwürdig, dass es keine nette Möglichkeit gibt, das zu tun ..>< –

Verwandte Themen