Tensorflow documentation表示tf.assign(ref, ...)
会返回ref
,但会显示(不出意外)返回Tensor
(附在assign
操作上):
import tensorflow as tf
sess = tf.InteractiveSession()
Q = tf.Variable(tf.constant(range(1, 12)))
sess.run(tf.global_variables_initializer())
qop = tf.assign(Q, tf.zeros(Q.shape, tf.int32))#.eval()
print(Q.eval())
print(qop.eval())
print(Q.eval())
产生
[ 1 2 3 4 5 6 7 8 9 10 11]
[0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0]
证明论证Q
和返回的qop
行为有所不同(Q
在执行qop
之前保持不变。
文档中是否正确描述了tf.assign
的返回值?
答案 0 :(得分:1)
查看Tensorflow关于操作的文档。 tf.assign
会返回Operation
,其中表示图形节点,可对张量执行计算。您可以使用这些操作来组成计算图。当您在图表的任何操作上调用eval
时,这些计算实际上会在以后发生。
在您的示例中,qop
是将零分配给变量Q
的操作的定义。您的示例图表看起来像Q --> qep
。出于教学目的,让我们将代码的顺序更改为:
Q = tf.Variable(tf.constant(range(1, 12)))
Q.eval() # Error: Variable has not been initalized.
sess.run(tf.global_variables_initializer())
Q.eval() # Output: array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], dtype=int32)
qop = tf.assign(Q, tf.zeros(Q.shape, tf.int32))
Q.eval() # Output: array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], dtype=int32)
qop.eval()
Q.eval() # Output array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype=int32)
第一次评估Q
时会出现错误,因为Q表示的变量尚未包含任何内容。但是在你运行sess.run(tf.global_variables_initializer())
后,错误消失了。这是因为该行代码运行一个初始化当前图形的所有全局变量的操作。在定义Q.eval()
操作后运行qop
时,Q
仍具有相同的值,因为已定义操作qop
,但尚未执行。执行qop
(qop.eval
)后,Q
所代表的变量的值会发生变化。