Variables 是否';tf.分配';返回其论点?

Variables 是否';tf.分配';返回其论点?,variables,tensorflow,variable-assignment,Variables,Tensorflow,Variable Assignment,Tensorflow表示tf.assign(ref,…)返回ref,但它似乎(毫不奇怪)返回了张量(附在assignop上): 产生 [ 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的返回值?查看Tensorflow关于操作的文档tf.assign返回一个操作,该操作表示对

Tensorflow表示
tf.assign(ref,…)
返回
ref
,但它似乎(毫不奇怪)返回了
张量(附在
assign
op上):

产生

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

查看Tensorflow关于操作的文档
tf.assign
返回一个
操作
,该操作表示对张量执行计算的图形节点。您可以使用这些操作组成计算图。这些计算实际上发生在稍后的时间,当您对图形的任何操作调用
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\u variables\u initializer())
之后,错误就会消失。这是因为该行代码运行一个初始化当前图形的所有全局变量的操作。定义
qop
操作后运行
Q.eval()
时,
Q
仍然具有相同的值,因为操作
qop
已定义,但尚未执行。执行
qop
qop.eval
)后,
Q
表示的变量值会发生变化。

因此文档是错误的:
tf.assign(ref,
不会返回
ref
),但会返回一个新的op(毫不奇怪).对吗?让我检查一下这些文档。它们至少是模棱两可的。在文档的一部分中,它们说:“通过将
赋给
来更新
ref
。这就是tf.assign操作执行后所做的。它们还说它返回的值与
ref
相同。如果执行
则键入(Q)
type(qop)
您会注意到它们有不同的类型。但是
Q.eval()
qop.eval()
的类型和形状将是相同的。第一部分是正确的,但是:“Returns:same as'ref'”显然是错误的,而且它的错误更加明显:为方便在重置变量后使用新值的操作而返回。对吗?应该是“返回:赋值操作,它在执行时更新'ref'的值”。否?
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)