2016-12-16 2 views
1

Ich baue eine LSTM wie:Tensorflow: DropoutWrapper führt zu unterschiedlichen Outputs?

lstm_cell = tf.nn.rnn_cell.LSTMCell(n_hidden, forget_bias=1.0, state_is_tuple=True, activation=tf.nn.tanh) 
lstm_cell = tf.nn.rnn_cell.DropoutWrapper(lstm_cell, output_keep_prob=0.5) 
lstm_cell = tf.nn.rnn_cell.MultiRNNCell([lstm_cell] * 3, state_is_tuple=True) 

Dann ich das Modell trainieren und Variablen speichern. Das nächste Mal, wenn ich gespeicherte Variablen lade und das Training auslasse, gibt es mir eine andere Vorhersage.

Wenn ich die output_keep_prob zu 1 ändern, kann dieses Modell mir immer die gleiche Vorhersage zeigen, aber wenn die output_keep_prob ist kleiner als 1, wie 0,5, dieses Modell zeigt mir verschiedene Vorhersage jedes Mal.

Also ich denke, wenn die DropoutWrapper zu unterschiedlichen Ausgang führt? Wenn ja, wie kann ich dieses Problem lösen?

Dank

Antwort

1

Versuchen Sie das seed Stichwort Argument DropoutWrapper(...) mit:

lstm_cell = tf.nn.rnn_cell.DropoutWrapper(lstm_cell, output_keep_prob=0.5, seed=42) 

Lesen Sie die Dokumentation here für DropoutWrapper.__init__

+0

Da es sich um eine zufällige Ganzzahl handelt, entspricht jede "Saat" einer anderen Art von Aussetzern? – nickzxd

+0

Wenn ja, sollte ich verschiedene 'samen' ausprobieren, um ein optimiertes Ergebnis zu erhalten? Es scheint ein großes Projekt zu sein, alle zufälligen ganzen Zahlen zu versuchen ... – nickzxd

+0

Hey @nickzxd und @kempy! Ich kann keine konsistenten Ergebnisse erzielen, nachdem ich 'Seed' im' DropoutWrapper' gesetzt habe. Wird noch etwas benötigt? – martianwars

1

Dropout wird eine Teilmenge der Netto zufällig aktiviert und während des Trainings verwendet wird, zur Regularisierung. Da Sie Dropout als 0,5 fest coded haben, bedeutet es, dass jedes Mal, wenn Sie das Netzwerk zur Hälfte ausführen, Ihre Knoten zufällig stumm geschaltet werden, was zu einem anderen und zufälligeren Ergebnis führt.

Sie können überprüfen, ob dies der Fall ist, indem Sie einen Seed setzen, so dass die gleichen Knoten jedes Mal durch Dropout "stumm geschaltet" werden. Was Sie jedoch wahrscheinlich tun möchten, ist Dropout als Platzhalter, so dass Sie ihn während der Testzeit auf 1.0 setzen können (dh alle Knoten behalten), wodurch die gleiche Ausgabe für jede Eingabe deterministisch erzeugt wird.

Verwandte Themen