2016-05-04 7 views
3

Ich habe Tensorflow mit dem l-bfgs Optimizer von openopt verwendet. Es war ziemlich einfach Callbacks zu erstellen, damit Tensorflow Gradienten und Verlustbewertungen für die L-Bfgs berechnen kann. Allerdings habe ich Probleme herauszufinden, wie man stochastische Elemente wie Dropout in den Trainingsprozess einbaut.Verwendung externer Optimierer mit Tensorflow und stochastischen Netzwerkelementen

Während der Leitungssuche führt l-bfgs mehrere Auswertungen der Verlustfunktion durch, die im selben Netzwerk wie die vorherige Gradientenauswertung arbeiten müssen. Es scheint jedoch, dass für jede Auswertung der tf.nn.dropout-Funktion eine neue Gruppe von Dropouts erzeugt wird. Ich suche nach einer Möglichkeit, das Dropout über mehrere Auswertungen der Verlustfunktion zu fixieren und dann zu erlauben, dass es zwischen den Gradientenschritten der I-Bfgs wechselt. Ich gehe davon aus, dass dies etwas mit den Kontrollfluss-Ops in Tensorflow zu tun hat, aber es gibt nicht wirklich ein gutes Tutorial, wie man diese verwendet und sie sind ein bisschen rätselhaft für mich.

Danke für Ihre Hilfe!

Antwort

3

Drop-out beruht auf Verwendungen random_uniform das ist ein Stateful-Op, und ich sehe keine Möglichkeit, es zurückzusetzen. Sie können aber um ihn herum hacken, indem Sie Ihre eigenen Zufallszahl ersetzt und sie auf den gleichen Eingangspunkt als random_uniform, ersetzt die generierten Werte

Unter dem folgenden Code Fütterung:

tf.reset_default_graph() 
a = tf.constant([1, 1, 1, 1, 1], dtype=tf.float32) 
graph_level_seed = 1 
operation_level_seed = 1 
tf.set_random_seed(graph_level_seed) 
b = tf.nn.dropout(a, 0.5, seed=operation_level_seed) 

das Diagramm visualisieren, um zu sehen, wo random_uniform verbunden ist

visualization of dropout

Sie dropout sehen die 012.386 nimmt die Eingabe von random_uniform durchop, die einen Namen mydropout/random_uniform/(random_uniform) hat. Tatsächlich ist das Suffix /(random_uniform) aus UI-Gründen da, und der wahre Name ist mydropout/random_uniform, wie Sie durch Drucken tf.get_default_graph().as_graph_def() sehen können. Das gibt Ihnen einen verkürzten Tensornamen. Jetzt fügen Sie :0 an, um den tatsächlichen Tensornamen zu erhalten. (Side-Anmerkung: Betrieb könnten mehrere Tensoren erzeugen, die zu :0 Suffixe entsprechen, :1 usw. Da ein Ausgang ist der häufigste Fall ist :0 implizit in GraphDef und node Eingang entspricht node:0:0 jedoch nicht implizit ist, wenn feed_dict verwenden. also müssen Sie explizit schreiben node:0)

So jetzt können Sie den Samen reparieren, indem Sie Ihre eigenen Zufallszahlen (von der gleichen Form wie eingehende Tensor), und die Wiederverwendung sie zwischen den Aufrufen.

tf.reset_default_graph() 
a = tf.constant([1, 1, 1, 1, 1], dtype=tf.float32) 
graph_level_seed = 1 
operation_level_seed = 1 
tf.set_random_seed(graph_level_seed) 
b = tf.nn.dropout(a, 0.5, seed=operation_level_seed, name="mydropout") 
random_numbers = np.random.random(a.get_shape()).astype(dtype=np.float32) 
sess = tf.Session() 
print sess.run(b, feed_dict={"mydropout/random_uniform:0":random_numbers}) 
print sess.run(b, feed_dict={"mydropout/random_uniform:0":random_numbers}) 

Sie sollten den gleichen Satz von Nummern mit 2 Laufaufrufen sehen.

Verwandte Themen