Myślałem, że przypisania zmiennych są wykonywane po wszystkich operacjach na liście podanej do sesji sess.run, ale poniższy kod zwraca różne wyniki przy różnym wykonaniu. Wydaje się, że losowo uruchamia operacje na liście i przypisuje zmienną po uruchomieniu operacji na liście.Tensorflow: Kiedy są wykonywane przypisania zmiennych w sess.run z listą?
a = tf.Variable(0)
b = tf.Variable(1)
c = tf.Variable(1)
update_a = tf.assign(a, b + c)
update_b = tf.assign(b, c + a)
update_c = tf.assign(c, a + b)
with tf.Session() as sess:
sess.run(initialize_all_variables)
for i in range(5):
a_, b_, c_ = sess.run([update_a, update_b, update_c])
Chciałbym poznać terminy przypisań zmiennych. Które są poprawne: "update_x -> assign x -> ... -> udpate_z -> assign z" lub "update_x -> udpate_y -> udpate_z -> assign a, b, c"? (gdzie (x, y, z) jest permutacją (a, b, c)) Dodatkowo, jeśli istnieje sposób, który realizuje to ostatnie przydział (przydział jest wykonywany po wykonaniu wszystkich operacji na liście), proszę daj mi znać, jak to zrealizować.
Dziękujemy za odpowiedź @mrry. Doceniłem to i zrozumiałem, jak określić kolejność operacji w moim kodzie. Następnie mam jeszcze jedno pytanie dotyczące twojej odpowiedzi. Jeśli operacje na liście mają pewne współzależności, czy ich wartości są przypisane po wykonaniu wszystkich operacji? A w takim przypadku, jaka jest kolejność wykonywania operacji domyślnie (bez użycia 'tf.control_dependencies'). – Sarah
Co rozumiesz przez "operacje na liście"? Ogólnie rzecz biorąc, opcje ops mogą być uruchamiane, gdy tylko ich nowa wartość jest dostępna. Operacje o zmiennej treści mogą być uruchamiane natychmiast po rozpoczęciu kroku. Jednak bez wyraźnych zależności kontrolnych (lub danych), przypisanie do zmiennej może nastąpić przed lub po odczytaniu tej samej zmiennej, w zależności od tego, w jaki sposób są planowane operacje. Domyślna kolejność jest w tym przypadku niezdefiniowana. – mrry
Przepraszamy za niejednoznaczny przypadek. Mam na myśli listę operacji, takich jak '[op1, op2, op3]'. Mogę mieć nieporozumienia. Pseudo kod: 'v = tf.Variable (0), c = tf.constant (3), add = tf.add (v, c), update = tf.assign (v, add), mul = tf.mul (add, update), sess.run ([mul, mul]) 'daje' [9, 9] 'not' [9, 36] '. Więc myślałem, że zadanie jest wykonywane po wszystkich operacjach na liście '[mul, mul]', tak jak mul -> mul -> assign, not mul -> assign -> mul -> assign. – Sarah