2015-12-21 12 views
9

Angenommen, Sie haben einige Stück Code haben wie dieseIst Tensorflow faul?

import tensorflow as tf 
... 
f = h*y + z*t #Just some expression involving other tensors. 
e = ... # some expression that does not involve f. 
result = tf.select(b, e, f) 

sess.run(result) 

b ist ein boolean Tensor der gleichen Form wie e und f. Wenn alle Elemente von b als wahr ausgewertet werden, brauchen wir nicht f und das Ergebnis wird einfach (oder gleich) e sein.

Die Frage: Wenn die Sitzung mit Ergebnis ausgeführt wird, und die Elemente von e sind alle wahr, wird f ausgewertet?

Antwort

13

TL; DR: TensorFlow streng, so dass beide e und f ausgewertet werden, bevor der tf.select() Knoten ausführt.

Dies hat einige Verwirrung verursacht. TensorFlow putzt zuerst das Datenflussdiagramm basierend auf den Operationen statisch, die erforderlich sind, um die Werte zu erzeugen, die abgerufen werden (d. H. Die Argumente zu sess.run()). Wenn das Diagramm jedoch bereinigt wurde, verwendet die Laufzeitumgebung eine strikte Ausführung, wobei alle Eingaben für eine Operation (wie tf.select()) berechnet worden sein müssen, bevor diese Operation ausgeführt werden kann.

Es gibt experimentelle Unterstützung für die bedingte Ausführung im Modul tf.control_flow_ops mit der tf.control_flow_ops.cond()-Funktion, aber dies ist zur Zeit nur spärlich dokumentiert.