tenorflow: как назначить обновленный numpy - PullRequest
0 голосов
/ 04 ноября 2018

Я новичок в тензорном потоке и пытаюсь понять его поведение; Я пытаюсь определить все операции вне области сеанса, чтобы оптимизировать время вычислений. В следующем коде:

import tensorflow as tf
import numpy as np  
Z_tensor = tf.Variable(np.float32( np.zeros((1, 10)) ), name="Z_tensor")
Z_np = np.zeros((1,10))
update_Z = tf.assign(Z_tensor, Z_np)

Z_np[0][2:4] = 4

with tf.Session() as sess:
    sess.run(Z_tensor.initializer)
    print(Z_tensor.eval())
    print(update_Z.eval(session=sess))

Я получаю как результат:

[[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]
[[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]

Вместо этого я ожидал в качестве вывода:

[[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]
[[0. 0. 4. 4. 0. 0. 0. 0. 0. 0.]]

Кажется, что массив Z_np не обновляется в операции присваивания, и я не понимаю, почему. Не операция

  update_Z = tf.assign(Z_tensor, Z_np)

сделать ссылку с Z_np?

1 Ответ

0 голосов
/ 04 ноября 2018

Когда вы используете tf.assign, он ожидает тензор в качестве второго аргумента. Поскольку вы предоставили массив Numpy, он автоматически преобразуется в тензор CONSTANT и помещает его в график в этот момент. Из-за этого никакие изменения, внесенные в массив Numpy, не будут влиять на график TensorFlow. Чтобы получить желаемую функциональность, вы должны использовать заполнитель:

Z_placeholder = tf.placeholder(tf.float32, Z_np.shape)

with tf.Session() as sess:
    sess.run(Z_tensor.initializer)
    print(Z_tensor.eval(feed_dict={Z_placeholder: Z_np}, session=sess))
    Z_np[0][2:4] = 4
    print(Z_tensor.eval(feed_dict={Z_placeholder: Z_np}, session=sess))
...