Программа Python, assign_add, результат может быть немного запутанным - PullRequest
0 голосов
/ 02 июля 2018

enter image description here

   b= tf.ones([3,3],dtype=tf.float32)
   c= tf.Variable(tf.random_normal([3,3],mean=1,stddev=2,dtype=tf.float32),name="c")
   d=tf.assign_add(c,b)
   init_op= tf.global_variables_initializer()
   with tf.Session() as sess:
     sess.run(init_op)
     x,y,z= sess.run([c,b,d])
     print(x,"\n!!\n",y,"\n!!\n",z,"\n!!")
     print(sess.run(d))

третий результат вывода массива должен быть добавлен 'b' и 'c', но результат не распечатался, как ожидалось. Вы можете мне помочь? Большое спасибо.

Я ожидаю, что третий результат вывода массива должен быть таким же, как и четвертый массив. Я смущен результатом третьего массива.

1 Ответ

0 голосов
/ 02 июля 2018

Кажется, что в отличие от того, как я понимаю документы на assign_add, эта операция может фактически возвращать значение переменной до добавление завершено, а не после.

Таким образом, в этом примере c - это переменная со значением [[4.723362, ...]]. В первом sess.run вы печатаете c, который имеет значение pre-assign_add, так как обновление выполняется после, b, который выглядит, как ожидалось, и d, который также возвращает предварительно значение assign_add, потому что, по-видимому, это работает как операция.
После этого c обновляется и теперь содержит значения [[5.723362, ...]]. Теперь вы снова запускаете d (assign_add op), который обновляет c, но снова возвращает значение pre-update , которое составляет [[5.723362, ...]].

В заключение, если мы примем, что возвращаемым значением tf.assign_add является переменная до сложения, и , которая работает c вместе с d в первом " Параллельный вызов run вернет c перед выполнением обновления, это имеет смысл. Вы можете убедиться в этом, добавив sess.run(c) в самом конце, который должен вернуть [[6.723362,...].

...