为什么以下Tensorflow代码会产生显示的结果?

时间:2016-09-27 10:27:43

标签: tensorflow

我正在关注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;

为什么?

1 个答案:

答案 0 :(得分:1)

结果确实是正确的。

定义时

state = tf.Variable(0, name="counter")
one = tf.constant(1)
state = tf.add(state, one)

您正在定义有序操作的图表,例如:

  1. state = 0
  2. one = 1
  3. 州=州+一
  4. 图表定义后,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:

      上一次迭代中
    • state1
    • 由于tf.assign(),
    • state具有相同的new_value值。
    • 由于new_valuestate + 1,现在它的值为2.
    • print(state.eval())打印2,因为这是state的当前值。

    迭代2:

      上一次迭代中
    • state2
    • ...

    情景(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")没有改变。