Variables 是否';tf.分配';返回其论点?
Tensorflow表示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返回一个操作,该操作表示对
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)