2017-11-28 4 views
1

Wie gehen Sie mit der Wettlaufbedingung um, wenn Sie tf.assign() verwenden? Zum Beispiel, wenn mein Code ist folgende:Race Condition bei Verwendung von tf.assign in Tensorflow

y = tf.Variable(6,trainable=False,name='y'); 
x = tf.Variable(0,trainable=False,name='x'); 
assign_op = tf.assign(x, 2); 
divide_op = y/assign_op; 
answer = sess.run([divide_op]); 

Meine Antwort ist entweder 3 oder 0inf .. Das einzige, was ich denken kann, ist die sess.run in diese Aufspaltung:

_ = sess.run([assign_op]); 
answer = sess.run([divide_op]); 

Ich dachte, dass das Erstellen einer Betriebsabhängigkeit, wie ich es oben getan habe, das Problem lösen würde, dass es eine Wettlaufbedingung gibt, aber das tut es nicht. Weiß jemand was zu tun ist?

Antwort

0

Sie wollen control_dependencies Flusssteuerungsfunktionen prüfen:

https://www.tensorflow.org/api_docs/python/tf/Graph#control_dependencies

with tf.control_dependencies([assign_op]): 
    divide_op = y/assign_op 

Dies wird die "assign_op" stellen Sie sicher, bevor die Diagrammelemente in dem Block abgeschlossen hat.

+0

Also, wenn ich die Referenzen von assign-Operationen verketten, würde ich mehrere control_dependencies benötigen, um sicherzustellen, dass die vorherige Zuordnung abgeschlossen wurde, bevor Sie fortfahren? Was ist, wenn ich die Referenz assign_op an zwei Orten verwende? Können beide Gleichungen in die control_dependencies gehen? Ich werde es versuchen und zurück posten. Danke! –

+0

Wenn ich richtig verstehe, wenn sie alle unabhängig sind, sollten Sie dann in der Liste [] hinzufügen können, also [assign_op, assign_op2, assign_op3]. Möglicherweise müssen Sie einige control_dependencies ändern, wenn die Reihenfolge der Operationen noch nicht eindeutig ist. – mazecreator

+0

Nur als eine zusätzliche Anmerkung funktioniert die Aufteilung sess.run() nur, wenn Sie einer Variablen Werte zuweisen, da das Diagramm schließlich nach jedem .run() zurückgesetzt wird. Um das zu umgehen, gab es ein partial_run(), was vor ungefähr einem Jahr vorgeschlagen wurde, nicht sicher, ob es in die Python API geschafft wurde oder nicht. – mazecreator