是吗?分配'返回它的论点?

时间:2017-06-02 18:09:24

标签: variables tensorflow variable-assignment

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的返回值?

1 个答案:

答案 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,但尚未执行。执行qopqop.eval)后,Q所代表的变量的值会发生变化。