我试图理解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.
我的问题是
在使用(=)的第二个片段中,当我有sess.run(a)时,似乎我正在运行一个assign op.那么"a = a + 1"在内部创建一个赋值操作,如assign_op = tf.assign(a,a + 1)?会话运行的op真的只是assign_op吗?但是当我运行a.eval()时,它不会继续增加a,因此看起来eval正在评估一个"静态"变量.
我不知道如何解释第三个片段.为什么两个evals增加了一个,但第二个片段中的两个evals没有?
谢谢.
这里的主要混淆是这样做a = a + 1会将 Python 变量重新分配a给加法运算的结果张量a + 1。tf.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)与使用当前会话没有太大区别)。
| 归档时间: |
|
| 查看次数: |
5052 次 |
| 最近记录: |