2017-09-28 3 views
0

In Keras (mit Tensorflow-Backend), ist das aktuelle Eingabemuster für meine benutzerdefinierte Verlustfunktion verfügbar?Keras benutzerdefinierte Verlustfunktion: Zugriff auf das aktuelle Eingabemuster

Das aktuelle Eingabemuster ist als der Eingabevektor definiert, der zum Erstellen der Vorhersage verwendet wird. Betrachten Sie beispielsweise Folgendes: X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42, shuffle=False). Dann ist das aktuelle Eingabemuster der aktuelle X_Verstärkungsvektor, der mit y_train assoziiert ist (der in der Verlustfunktion als y_true bezeichnet wird).

Beim Entwerfen einer benutzerdefinierten Verlustfunktion möchte ich einen Wert optimieren/minimieren, der Zugriff auf das aktuelle Eingabemuster erfordert, nicht nur auf die aktuelle Vorhersage.

Ich habe einen Blick durch https://github.com/fchollet/keras/blob/master/keras/losses.py

ich eine individuelle Verlustfunktion zu erzeugen, durch „Cost function that isn't just y_pred, y_true?

Ich bin auch vertraut mit den vorherigen Beispielen sah genommen haben auch:

import keras.backend as K 

def customLoss(y_true,y_pred): 
    return K.sum(K.log(y_true) - K.log(y_pred)) 

Vermutlich sind (y_true,y_pred) an anderer Stelle definiert. Ich habe den Quellcode ohne Erfolg durchgesehen und frage mich, ob ich das aktuelle Eingabemuster selbst definieren muss oder ob dies bereits für meine Verlustfunktion verfügbar ist.

+0

Können Sie angeben, was Sie mit dem aktuellen Eingabemuster meinen? – blackplant

+0

Wenn Sie folgendes berücksichtigen: "X_Zug, X_Test, y_Zug, y_test = Zug_Test_Split (X, y, Testgröße = 0.33, Zufallszustand = 42, Zufall = Falsch)". Dann ist das aktuelle Eingabemuster der aktuelle X_Verstärkungsvektor, der mit y_train assoziiert ist (der in der Verlustfunktion als y_true bezeichnet wird). – jtromans

Antwort

1

Sie können die Loss-Funktion als innere Funktion umschließen und Ihren Eingabe-Tensor an sie übergeben (wie gewöhnlich bei der Übergabe zusätzlicher Argumente an die Loss-Funktion).

def custom_loss_wrapper(input_tensor): 
    def custom_loss(y_true, y_pred): 
     return K.binary_crossentropy(y_true, y_pred) + K.mean(input_tensor) 
    return custom_loss 

input_tensor = Input(shape=(10,)) 
hidden = Dense(100, activation='relu')(input_tensor) 
out = Dense(1, activation='sigmoid')(hidden) 
model = Model(input_tensor, out) 
model.compile(loss=custom_loss_wrapper(input_tensor), optimizer='adam') 

können Sie, dass input_tensor überprüfen und der Verlustwert als andere X zum Modell übergeben ändern.

X = np.random.rand(1000, 10) 
y = np.random.randint(2, size=1000) 
model.test_on_batch(X, y) # => 1.1974642 

X *= 1000 
model.test_on_batch(X, y) # => 511.15466 
+0

Danke @ Yu-Yang. Ist dieser Ansatz auf die funktionale API beschränkt? – jtromans

+0

Ich denke, Sie können 'loss = custom_loss_wrapper (model.input)' für 'Sequential' verwenden. –

Verwandte Themen