Tensorflow 为什么tf.stop_梯度可以';t冻结变量?

Tensorflow 为什么tf.stop_梯度可以';t冻结变量?,tensorflow,Tensorflow,看看代码: 将tensorflow导入为tf x=tf.变量(1) x=tf.停止梯度(x) y=2*x g=tf.梯度(y,x) init=tf.global_variables_initializer() 使用tf.Session()作为sess: init.run() 打印(sess.run(g)) 我想冻结x,并且ywrtx的梯度为零,但是输出是2,那么有什么问题吗 更新 将tensorflow导入为tf x0=tf.变量(1) x1=tf.停止梯度(x0) y=2*x1 g=tf.梯

看看代码:

将tensorflow导入为tf
x=tf.变量(1)
x=tf.停止梯度(x)
y=2*x
g=tf.梯度(y,x)
init=tf.global_variables_initializer()
使用tf.Session()作为sess:
init.run()
打印(sess.run(g))
我想冻结
x
,并且
y
wrt
x
的梯度为零,但是输出是
2
,那么有什么问题吗

更新
将tensorflow导入为tf
x0=tf.变量(1)
x1=tf.停止梯度(x0)
y=2*x1
g=tf.梯度(y,x0)
init=tf.global_variables_initializer()
使用tf.Session()作为sess:
init.run()
打印(sess.run(g))
我使用的
x1
不会覆盖
x0
,但当我运行此代码时,它会引发错误。如果
tf.stop\u gradient
充当
tf.identity
,我认为
x0
将在计算图中有一个路径到
y
,梯度是
0
,而不是引起错误?有人能告诉我tf.stop\u gradient确实做了什么吗?

tf.stop\u gradient()
在计算图中的指定点停止梯度计算。将其应用于变量“太晚了”,但您可以将其应用于
y

将tensorflow导入为tf
x=tf.变量(1)
y=tf.停止梯度(2*x)
g=tf.梯度(y,x)
init=tf.global_variables_initializer()
使用tf.Session()作为sess:
init.run()
打印(sess.run(g))

请注意,这不会输出
0
,而是会抛出一个错误,因为在这种情况下,y w.r.t.到x的梯度未定义,并且您明确要求它。在真实场景中,情况可能并非如此。

您使用stop_gradient的结果重写了原始的
x
,因此,当您调用
tf.gradients
时,您并不是在计算变量的gradient wrt。使用另一个变量来存储stop_gradient的输出,你不会看到这个,这基本上与我的答案相同
tf.stop_gradient()
的作用类似于没有渐变定义的标识op。仍然可以导出梯度w.r.t。它是输入,但链式规则在这一点停止。引入一个临时变量将产生与我的答案相同的效果@etarisonsee my update@chretr这个答案掩盖了这个问题。将它应用于x并不“太晚”(这个答案中的代码甚至在计算的后期应用它)。它没有提到OP犯的错误(将stop_gradient的结果传递给tf.gradients)。