tf.assign和赋值运算符之间的区别(=)

use*_*020 13 tensorflow

我试图理解tf.assign和赋值运算符(=)之间的区别.我有三组代码

首先,使用简单的tf.assign

import tensorflow as tf

with tf.Graph().as_default():
  a = tf.Variable(1, name="a")
  assign_op = tf.assign(a, tf.add(a,1))
  with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print sess.run(assign_op)
    print a.eval()
    print a.eval()
Run Code Online (Sandbox Code Playgroud)

输出预计为

2
2
2
Run Code Online (Sandbox Code Playgroud)

其次,使用赋值运算符

import tensorflow as tf

with tf.Graph().as_default():
  a = tf.Variable(1, name="a")
  a = a + 1
  with tf.Session() as sess:
   sess.run(tf.global_variables_initializer())
   print sess.run(a)
   print a.eval()
   print a.eval()
Run Code Online (Sandbox Code Playgroud)

结果仍然是2,2,2.

第三,我用两个 tf.assign和赋值操作符

import tensorflow as tf

with tf.Graph().as_default():
  a = tf.Variable(1, name="a")
  a = tf.assign(a, tf.add(a,1))
  with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print sess.run(a)
    print a.eval()
    print a.eval()
Run Code Online (Sandbox Code Playgroud)

现在,输出变为2,3,4.

我的问题是

  1. 在使用(=)的第二个片段中,当我有sess.run(a)时,似乎我正在运行一个assign op.那么"a = a + 1"在内部创建一个赋值操作,如assign_op = tf.assign(a,a + 1)?会话运行的op真的只是assign_op吗?但是当我运行a.eval()时,它不会继续增加a,因此看起来eval正在评估一个"静态"变量.

  2. 我不知道如何解释第三个片段.为什么两个evals增加了一个,但第二个片段中的两个evals没有?

谢谢.

E_n*_*ate 5

这里的主要混淆是这样做a = a + 1会将 Python 变量重新分配a给加法运算的结果张量a + 1tf.assign,另一方面,是用于设置 TensorFlow 变量值的操作。

a = tf.Variable(1, name="a")
a = a + 1
Run Code Online (Sandbox Code Playgroud)

这相当于:

a = tf.add(tf.Variable(1, name="a"), 1)
Run Code Online (Sandbox Code Playgroud)

考虑到这一点:

在使用 (=) 的第二个代码段中,当我有 sess.run(a) 时,似乎我正在运行分配操作。那么“a = a+1”是否在内部创建了一个赋值操作,比如assign_op = tf.assign(a, a+1)?[...]

看起来可能如此,但事实并非如此。如上所述,这只会重新分配 Python 变量。并且没有tf.assign或任何其他更改变量的操作,它保持值 1。每次a计算时,程序将始终计算a + 1 => 1 + 1

我不知道如何解释第三个片段。为什么两个 eval 增加了 a,但第二个片段中的两个 eval 没有?

这是因为调用eval()第三个片段中的赋值张量也会触发变量赋值(请注意,这session.run(a)与使用当前会话没有太大区别)。