2016-11-06 5 views
2

Ich habe ein Netzwerk in Keras mit vielen Ausgängen, aber meine Trainingsdaten liefern nur Informationen für einen einzelnen Ausgang zu einem Zeitpunkt.Ausbildung nur ein Ausgang eines Netzwerks in Keras

meine Methode für die Ausbildung Im Moment hat eine Vorhersage über die Eingabe in Frage laufen, um den Wert der jeweiligen Ausgabe ändern, die ich trainiert habe und dann ein einzelnes Charge-Update zu tun. Wenn ich richtig liege, ist das das Gleiche, als würde ich den Verlust für alle Ausgänge auf Null setzen, außer für den, den ich trainieren möchte.

Gibt es einen besseren Weg? Ich habe Klassengewichte ausprobiert, bei denen ich für alle außer dem Ausgang, den ich trainiere, ein Nullgewicht festlege, aber es gibt mir nicht die Ergebnisse, die ich erwarte?

Ich verwende das Theano-Backend.

+0

Das ist eine ungewöhnliche Einstellung für beaufsichtigte-Learning. Zeigen Sie einige Beispieldaten und erklären Sie ein wenig, warum Sie diese Einstellung erhalten haben. – sascha

+0

Ich benutze es für Deep Q-Learning. Die Eingabe ist ein Zustand und jede Ausgabe ist die Punktzahl für eine Aktion. Sie wählen eine Aktion aus und aktualisieren dann das Netzwerk basierend auf dem Ergebnis dieser Aktion. Sie wollen nur einen Ausgang aktualisieren, da Sie das Ergebnis der anderen Aktionen nicht kennen ... – simeon

+1

Ich sehe. Dies wird unterschiedlich gehandhabt. Sehen Sie sich [diese Quellen] an (https://gist.github.com/EderSantana/c7222daa328f0e885093#file-qlearn-py-L98) (ich markierte die Linie in der Verbindung). Sie behalten nur die aktuellen Werte für die anderen Aktionen! – sascha

Antwort

0

Um dies zu erreichen, endete ich die ‚Functional API‘ zu verbrauchen. Sie erstellen im Grunde genommen mehrere Modelle mit denselben Ebenen für Eingabe und ausgeblendete Ebenen, jedoch mit unterschiedlichen Ausgabeschichten.

Zum Beispiel:

https://keras.io/getting-started/functional-api-guide/

from keras.layers import Input, Dense 
from keras.models import Model 

# This returns a tensor 
inputs = Input(shape=(784,)) 

# a layer instance is callable on a tensor, and returns a tensor 
x = Dense(64, activation='relu')(inputs) 
x = Dense(64, activation='relu')(x) 
predictions_A = Dense(1, activation='softmax')(x) 
predictions_B = Dense(1, activation='softmax')(x) 

# This creates a model that includes 
# the Input layer and three Dense layers 
modelA = Model(inputs=inputs, outputs=predictions_A) 
modelA.compile(optimizer='rmsprop', 
       loss='categorical_crossentropy', 
       metrics=['accuracy']) 
modelB = Model(inputs=inputs, outputs=predictions_B) 
modelB.compile(optimizer='rmsprop', 
       loss='categorical_crossentropy', 
       metrics=['accuracy']) 
Verwandte Themen