我使用op"分配"更改变量的值而不是" =",但我发现我得到的渐变是完全不同的。谁能告诉我差异和原因?谢谢! 比如改变 w = w1 到 op1 = tf.assign(w,w1)sess.run(op1)
答案 0 :(得分:1)
=
和tf.assign
是不同的操作。
=
是 python 操作,在其中为python变量指定python值
tf.assign
是一个Tensorflow操作,它将值赋给变量ref并返回赋值操作。
=
在python中执行,不会影响计算图。
tf.assign
是计算图中的一个节点。
要理解,让我们运行这个简单的脚本
import tensorflow as tf
x = tf.Variable(1)
y = tf.Variable(2)
x = y
print(x.name, y.name)
a = tf.Variable(1)
b = tf.Variable(2)
# override a, otherwise a content is 1
a = a.assign(b)
print(a.name, b.name)
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
print(sess.run([x, y, a, b]))
print(x.name, y.name)
输出Variable_1:0 Variable_1:0
因为=
在python中执行而你已经覆盖了变量x
。
print(a.name, b.name)
输出Assign:0 Variable_3:0
,因为您在计算图中定义了分配操作,现在a
是分配操作。
运行定义的图表时,您会得到:
[2, 2, 2, 2]
但是这些值的计算方式不同:一个是图中的计算,其他是否。
如果您忘记将a
分配给使用tf.assign
创建的分配操作(因此您将行a = a.assign(b)
更改为a.assign(b)
),那么当你评估图表时,你会得到:
[2, 2, 1, 2]