(Tensorflow)op assign是否改变了梯度计算?

时间:2016-12-13 08:08:12

标签: tensorflow

我使用op"分配"更改变量的值而不是" =",但我发现我得到的渐变是完全不同的。谁能告诉我差异和原因?谢谢! 比如改变 w = w1 op1 = tf.assign(w,w1)sess.run(op1)

1 个答案:

答案 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]