2016-03-10 6 views
5

Kann TensorFlow Berechnungen automatisch cachen, wenn sie mehrere Aufrufe desselben Berechnungs- (Teil-) Graphen beinhalten?Kann TensorFlow Cache (Sub-) Graph Berechnungen?

Zum Beispiel habe ich eine Matrix F in der jeder Eintrag eine Berechnung basierend auf trainierbaren Variablen W darstellt. Meine Zielfunktion multipliziert diese Matrix mehrfach mit verschiedenen Vektoren (jeweils mal mit unverändertem W).

Will TensorFlow z. B. F[1,2] neu berechnen, wenn ich auf es zugreifen, oder wird es diesen Wert zwischenspeichern?

Theoretisch könnte man die Matrix F gegeben precompute eine festes W, derart, dass jeder Eintrag in F a tf.constant ist. Aber das würde die korrekte Berechnung der Gradienten von W verhindern.

+0

Diese Frage scheint verwandt zu sein: http://stackoverflow.com/questions/34536340/how-to-use-tensorflow-optimizer-without-recomputing-activations-in-verstärkung –

Antwort

2

TensorFlow führt eine begrenzte Menge an Caching durch, aber es deckt wahrscheinlich nicht den von Ihnen beschriebenen Fall ab.

Wenn Sie eine tf.Session mit den folgenden Optionen, konstantes Falten schaffen wird aktiviert:

config = tf.ConfigProto(graph_options=tf.GraphOptions(
    optimizer_options=tf.OptimizerOptions(opt_level=tf.OptimizerOptions.L2))) 
sess = tf.Session(config=config) 

Wenn Sie sess.run() mit dieser Konfiguration aufrufen, TensorFlow werden die entsprechenden Knoten bewerten zu laufen, identifizieren dann die Subgraphen derjenigen Knoten, deren Ausgaben konstant sind, diese auswerten und die Ergebnisse zwischenspeichern. Daher wird vermieden, dass redundante Berechnungen erneut ausgeführt werden. In Ihrer Frage erwähnen Sie, dass F eine Funktion einiger trainierbarer Variablen ist. Aus der Sicht von TensorFlow sind diese Variablen flüchtig — sie können sich jederzeit ändern —, so dass es keine Werte zwischenspeichert, die von diesen Variablen abgeleitet sind. Wenn Sie den gleichen Wert für F mehrmals verwenden möchten, können Sie ihn in einem tf.constant() speichern, so dass die konstante Faltungsoptimierung nützlicher ist.

+0

Danke für die Info. Ich sehe, dass die Option 'tf.OptimizerOptions.L1'' common_subprection_elimination' und 'tf.OptimizerOptions.L2'' constant_folding' hat. Aber wenn diese Optionen nicht korrekt mit den Gradienten umgehen, würde das für meinen Fall nicht funktionieren. –

+0

Beide Optimierungen sollten keinen Einfluss auf die Semantik Ihres Programms haben, sollten also die Gradienten richtig behandeln. Da jedoch die überwiegende Mehrheit der Gradientenberechnung von den aktuellen Variablenwerten abhängt, würde ich keine große Beschleunigung erwarten (vielleicht ein paar Prozent, aufgrund des Eliminierens von Operationsversorungsaufwand). – mrry