2017-10-05 16 views
1

Ich möchte Euklidische Entfernung als eine Verlustfunktion für LSTM oder RNN festlegen.Euklidische Distanzverlustfunktion für RNN (Keras)

Welche Ausgabe sollte eine solche Funktion haben: float, (batch_size) oder (batch_size, timesteps)?

Modelleingabe X_train ist (n_samples, timesteps, data_dim). Y_train hat die gleichen Abmessungen.

Beispielcode:

def euc_dist_keras(x, y): 
    return K.sqrt(K.sum(K.square(x - y), axis=-1, keepdims=True)) 


model = Sequential() 
model.add(SimpleRNN(n_units, activation='relu', input_shape=(timesteps, data_dim), return_sequences=True)) 
model.add(Dense(n_output, activation='linear')) 

model.compile(loss=euc_dist_keras, optimizer='adagrad') 

model.fit(y_train, y_train, batch_size=512, epochs=10) 

So sollte ich durchschnittliche Verlust über Zeitschritte Dimension und/oder batch_size?

Antwort

2

Ein Verlust Funktionen nehmen vorhergesagt und wahre Etiketten und ausgeben wird ein Skalar, in Keras:

from keras import backend as K 
def euc_dist_keras(y_true, y_pred): 
    return K.sqrt(K.sum(K.square(y_true - y_pred), axis=-1, keepdims=True)) 

Hinweis, dass es nicht X_train als eine Eingabe nehmen. Die Verlustberechnung folgt dem Vorwärtsausbreitungsschritt, und ihr Wert stellt die Güte der vorhergesagten Markierungen im Vergleich zu echten Markierungen bereit.

Welche Ausgabe sollte eine solche Funktion haben: Schwimmer, (batch_size) oder (batch_size, Zeitschritte)?

Die Verlustfunktion sollte skalare Ausgabe haben.

Also, sollte ich durchschnittlichen Verlust über Zeitschritte Dimension und/oder Batch_size?

Dies wäre nicht erforderlich, um die euklidische Distanz als Verlustfunktion verwenden zu können.

Seitliche Anmerkung: In Ihrem Fall denke ich, das Problem könnte mit der neuronalen Netzwerkarchitektur, nicht der Verlust sein. Bei (batch_size, timesteps, data_dim) wird die Ausgabe von SimpleRNN(batch_size, timesteps, n_units) sein, und die Ausgabe von Dense Schicht wird (batch_size, n_output) sein. Wenn Sie also Y_train die Form (batch_size, timesteps, data_dim) haben, müssten Sie wahrscheinlich TimeDistributedwrapper für jede temporäre Schicht verwenden und die Anzahl der versteckten Einheiten in der vollständig verbundenen Schicht anpassen.

Verwandte Themen