2016-08-29 1 views
1

Angenommen, mein Berechnungsdiagramm hat nur zwei Knoten. Node 1 -> Node 2 (Node1 der Ausgang ist Knoten2 der Eingang Knoten2 arbeitet auch auf Node1 der Eingabe..) Computation Graph wie folgt aussieht:Nachfolgende Aufrufe von sess.run() löschen Zustand?

x = Node1(z) 

y = Node2(x, z) 

Nun, wenn ich Run Node1 sess.run mit und führen Sie Node2 ein mit verschiedenen sess.run Anruf, würde der Zustand, wie in x über die Anrufe erhalten werden oder würde x von Grund auf im zweiten Anruf berechnet werden?

+0

zumindest ist es für s.run ([x, y]) erhalten – Julius

Antwort

2

Im Allgemeinen, es sei denn Sie assign it to a tf.Variable oder enqueue it in a queue, TensorFlow den Wert aller Zwischen Tensoren verwendet verwerfen, wenn das Ergebnis der Berechnung Session.run(), sobald sie nicht mehr benötigt werden, um Speicherplatz freizugeben.

Eine Ausnahme von dieser Regel ist, dass, wenn in Ihrem Programm z ein konstanter Tensor ist, und Node1() ist eine Stateless-Betrieb (das heißt ein pure function), TensorFlow kann das Ergebnis der Node1() als Teil einer constant folding Optimierung zwischenzuspeichern. Diese Optimierung kann nachfolgende Ausführungen von Session.run() schneller machen, auf Kosten von zusätzlicher Arbeit beim ersten Durchlauf. Wenn z jedoch eine a-Variable ist oder Node1() eine zustandsbehaftete Operation ist, kann TensorFlow das Ergebnis nicht sicher zwischenspeichern und wird bei jedem Aufruf Session.run() erneut ausgewertet. (Außerdem führt TensorFlow derzeit eine konstante Faltung für jeden einzelnen Satz von Argumenten zu Session.run() durch, sodass der Wert für x, der beim Ausführen von Node1() berechnet wurde, nicht in der Konstantenfaltung für Node2() wiederverwendet wird. Diese Optimierung könnte jedoch in Zukunft hinzugefügt werden .)

Verwandte Themen