2017-06-09 5 views
2

Ich konnte niemanden mit diesem Problem finden, also frage ich. Ich möchte eine benutzerdefinierte Verlustfunktion in Keras/Tensorflow implementieren, die verschiedene Spalten der y-Werte unterschiedlich behandelt. Ich habe gelesen, dass dies nicht sofort möglich war, da die Keras-Loss-Funktion nur zwei Parameter y_pred und y_true akzeptiert.Keras benutzerdefinierte Verlustfunktion mit zwei Eingängen

Aber ich habe versucht, diese auf zwei Eingänge zu teilen, um zu erreichen, was ich will.

def noise_loss_fct9(y_true, y_pred): 
    lmbd = 1.0 
    border = 9 
    y_true_measurement = y_true[:, :border] 
    y_true_process = y_true[:, border:] 
    y_pred_measurement = y_pred[:, :border] 
    y_pred_process = y_pred[:, border:] 

    error_measurement = K.mean(K.square(
     y_true_measurement - y_pred_measurement 
), axis=-1) 
    error_process = K.mean(K.square(
     y_true_process - y_pred_process 
), axis=-1) 

    return error_measurement + lmbd * error_process 

Auch wenn diese Verlustfunktion in der log zusammengestellt erhält es zeigt nan als Verlust.

Epoch 1/10 
95s - loss: nan 
Epoch 2/10 
87s - loss: nan 

Bedeutet dies, dies überhaupt kein gültiger Weg ist (auch wenn das Modell kompiliert) oder ist er gerade nicht den Verlust aus irgendeinem Grunde zeigt? Was sonst sollte ich tun, wenn dies nicht ist

Ich bin dankbar für Kommentare.

+0

Haben Sie überprüft, ob Sie irgendwelche 'Nan's in Ihrem Datensatz hatten? Beginnt es mit der ersten Charge? Funktioniert es mit "Loss" auf "Mse"? –

Antwort

0

Meinten Sie zwei Ausgänge?

Was Sie zu tun scheinen, ist sicherlich möglich. Die Tatsache, dass Sie eine Nanotechnologie erhalten, deutet darauf hin, dass mit der Art und Weise, wie Sie sie implementieren, etwas nicht stimmt. Ich empfehle das Ausführen von print (math.isnan()) an bestimmten Punkten in Ihrer Verlustfunktion, um zu sehen, woher der Fehler kommt. Können Sie nähere Angaben dazu machen, was Sie zu tun versuchen?

0

Eine Verlustfunktion muss eine "Zahl" (oder vielleicht einen Tensor mit nur einer Zahl) zurückgeben, keinen Tensor mit vielen Zahlen.

Wenn Sie "Achse" in der "k.mean" verwenden, behalten Sie es als Tensor mit vielen Einträgen.

Versuchen Sie "Achse = Keine" oder entfernen Sie einfach den Achsenparameter.


Es ist möglich, dass das Problem von früher im Modell kommt. Um sicher zu gehen, versuchen Sie zuerst Ihr Modell mit einer regulären "Mse" -Loss-Funktion, nur für den Fall.

Verwandte Themen