我正在关注tensorflow教程进行一些测试。在官方tutorial的变量部分中,有一个代码片段,指示如何使用tensorflow来实现计数器。我改变了一点,结果改变如下。但是,我不知道背后的逻辑。
我更改的代码的具体行是state = tf.add(state, one)
。我想在调用sess.run(state)
时,add
操作应该多次执行,产生结果0 1 2 3
。但是,它仍然是1 1 1 1
。有什么解释吗?
import tensorflow as tf
state = tf.Variable(0, name="counter")
one = tf.constant(1)
state = tf.add(state, one)
init_op = tf.initialize_all_variables()
with tf.Session() as sess:
sess.run(init_op)
print(sess.run(state))
for _ in range(3):
print(sess.run(state))
输出
1
1
1
1
后续行动
import tensorflow as tf
state = tf.Variable(0, name="counter")
one = tf.constant(1)
new_value = tf.add(state, one)
state = tf.assign(state, new_value) ## <== (1)
#state = tf.add(0, new_value) ## <== (2)
init_op = tf.initialize_all_variables()
with tf.Session() as sess:
sess.run(init_op)
for _ in range(4):
print(state.eval())
如果使用行(1)
但不使用(2)
,则结果为1 2 3 4
;
如果使用行(2)
但不使用(1)
,则结果为1 1 1 1
;
为什么?
答案 0 :(得分:1)
结果确实是正确的。
定义时
state = tf.Variable(0, name="counter")
one = tf.constant(1)
state = tf.add(state, one)
您正在定义有序操作的图表,例如:
图表定义后,state
保留图表的最后一个操作,而不是tf.add(state, one)
的数值。
因此,当您在循环中运行sess.run(state)
时,您要求Tensorflow多次运行您创建的图形,但操作图形将始终相同,因此结果始终相同。 / p>
好的,让我们看看您提供的代码在(1)
和(2)
两种情况下发生了什么。
import tensorflow as tf
state = tf.Variable(0, name="counter")
one = tf.constant(1)
new_value = tf.add(state, one)
state = tf.assign(state, new_value) ## <== (1)
#state = tf.add(0, new_value) ## <== (2)
init_op = tf.initialize_all_variables()
with tf.Session() as sess:
sess.run(init_op)
for _ in range(4):
print(state.eval())
情景(1)
在这种情况下,您要拨打state.eval()
4次。什么是国家?好吧,它是一个变量,因为您之前已将其初始化为:
state = tf.Variable(0, name="counter")
然后使用第(1)行state = tf.assign(state, new_value)
,您正在做的是为此变量赋值。 documentation for tf.assign()表示它返回相同的变量,因此在行(1)状态仍然是与之前相同的变量之后,现在只有它具有值new_value
。
那么new_value
是什么?它只是在state
中定义的变量new_value = tf.add(state, one)
中添加1的结果。
现在我们可以看到如果你四次评估state
会发生什么:
迭代0:
state
的初始值为0 new_value
是一个定义state
+ 1的操作,因此在评估时它的值为1. tf.assign
,您将state
设置为new_value
的值,现在为1。print(state.eval())
打印1
,因为这是state
的当前值。迭代1:
state
为1
。state
具有相同的new_value
值。new_value
为state
+ 1
,现在它的值为2. print(state.eval())
打印2
,因为这是state
的当前值。迭代2:
state
为2
。情景(2)
这里发生的是你正在覆盖初始state
这是一个具有操作tf.add
的张量流变量,因此代码不再按照您的预期进行操作。让我解释一下。
首先state
是一个变量,其值0
初始化为:
state = tf.Variable(0, name="counter")
和new_value
是定义state
+ 1
的操作,因此在评估时它的值为1
。
然后,通过将state
分配给操作tf.add(0, new_value)
来覆盖new_value
。为什么这很重要?好吧,因为state
取决于state
,是的,但是在覆盖它之前它取决于state
的内容,所以它使用了&#34; old&#34; 0
这是一个值为state.eval()
的变量。
因此,当您致电tf.add(0, new_value)
四次时,您正在评估1
四次,其结果始终为new_value
,因为1
始终为state
,作为&#34; old&#34;的价值from item in xdoc.Descendants("Setting")
没有改变。