(Tensorflow)op赋值是否会改变梯度计算?

(Tensorflow)op赋值是否会改变梯度计算?,tensorflow,Tensorflow,我使用op“assign”来更改变量的值,而不是“=”,但我发现得到的梯度非常不同。有人能告诉我区别和原因吗?谢谢 类似于将w=w1更改为op1=tf。分配(w,w1)sess.run(op1)=和tf.assign是不同的操作 =是一种python操作,在该操作中,您将python值分配给python变量 tf.assign是一种Tensorflow操作,它将值分配给变量ref并返回赋值操作 =在python中执行,不会影响计算图。 tf.assign是计算图中的一个节点 为了理解,让我们运行

我使用op“assign”来更改变量的值,而不是“=”,但我发现得到的梯度非常不同。有人能告诉我区别和原因吗?谢谢
类似于将w=w1更改为op1=tf。分配(w,w1)sess.run(op1)

=
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]))
打印(x.name,y.name)
输出
变量\u 1:0变量\u 1:0

因为
=
是在python中执行的,并且您已经覆盖了变量
x

print(a.name,b.name)
outputs
Assign:0 Variable\u 3:0
因为您在计算图中定义了赋值运算,现在
a
是赋值运算

运行定义的图形时,您会得到:

[2, 2, 2, 2]
但这些值的计算方式不同:一个是图形中的计算,另一个不是

如果您忘记将
a
分配给使用
tf.assign
创建的assign op(因此您将行
a=a.assign(b)
更改为
a.assign(b)
),那么在计算图形时,您将得到:

[2, 2, 1, 2]

非常感谢你的解释。但是你能告诉我op赋值对梯度计算的贡献吗?我真的很困惑,实际上我想在不改变梯度计算的情况下改变变量的值,如果使用得当,它不会改变梯度计算。Tensorflow使用自动微分来计算梯度,因此赋值运算只需在计算图中创建一个包含赋值变量的新节点。如果计算此节点的渐变,它将通过而不做任何更改。通常,如果混淆assign和=ops,您会看到渐变结果的差异,因为您正在弄乱图形节点
w=tf.Variable(weights,name='w'+str(i),dtype='float32')w1=binary(w)w=w1
如何使用op assign更改此值?(我想使渐变计算相同)谢谢您的回复。二进制类似于
def binary(w):G=tf.get\u default\u graph()和G.gradient\u override\u map({“Sign”:“Identity”}):E=tf.stop\u gradient(tf.reduce\u mean(tf.abs(w)))返回tf.Sign(w/E)*E
谢谢您的解释。但实际上我想做的是,首先,我建立一个图表,然后改变变量的值,而不改变每个历元的梯度计算。所以你能给我一些建议吗?