Tensorflow 梯度磁带不计算梯度

Tensorflow 梯度磁带不计算梯度,tensorflow,deep-learning,tensorflow2.0,gradienttape,Tensorflow,Deep Learning,Tensorflow2.0,Gradienttape,我知道,只要我在tf.GradientTape()上下文中定义一个计算,梯度带就会计算梯度w.r.t计算输出所依赖的所有变量。然而,我认为我并没有完全理解渐变的微妙之处,因为下面的代码并不像我期望的那样执行: import tensorflow as tf x = tf.Variable(2.) loss_ = x**2-2*x+1 with tf.GradientTape(persistent=True) as g: loss = loss_*1 print(g.gradient(lo

我知道,只要我在
tf.GradientTape()
上下文中定义一个计算,梯度带就会计算梯度w.r.t计算输出所依赖的所有变量。然而,我认为我并没有完全理解渐变的微妙之处,因为下面的代码并不像我期望的那样执行:

import tensorflow as tf
x = tf.Variable(2.)
loss_ = x**2-2*x+1
with tf.GradientTape(persistent=True) as g:
    loss = loss_*1
print(g.gradient(loss,x))
output: None
为什么不计算梯度wrt x

我只能够计算与上下文中显式使用的变量相关的梯度。例如,以下代码也不计算渐变:

import tensorflow as tf
tf.compat.v1.disable_eager_execution()
x = tf.Variable(2.)
t1 = x**2
t2 = -2*x
t3 = 1.
with tf.GradientTape(persistent=True) as g:
    loss = t1+t2+t3
print(g.gradient(loss,x))

GradientTape
对象
g
with
语句结束后超出范围

换句话说,尝试使用语句在
内部打印渐变

以下是对我有效的方法:

def get_gradients(inputs, target, model):
    with tf.GradientTape() as tape:
        prediction = model(inputs)
        loss = loss_object(target, prediction)
        gradient = tape.gradient(loss, model.trainable_variables)

    return gradient

不,没有。事实上,我得到了警告:warning:tensorflow:GradientTape.gradient在其上下文内的持久性磁带上调用要比在上下文外调用效率低得多(它会导致梯度操作记录在磁带上,导致CPU和内存使用率增加)。如果确实要跟踪梯度以计算高阶导数,请仅在上下文中调用GradientTape.gradient。不好,所以我的第二个猜测是,也许你的损失定义不正确。也许可以尝试使用Keras来定义它。后端操作(以及变量本身)也可以检查我的示例:您需要在磁带上下文中计算
loss
。但是我在上下文中计算
loss
,我在计算
loss
的梯度网,而不是
loss
??具体的方法是什么?从开始到结束的整个计算都需要在范围内。范围之外发生的事情不会被追踪。由于您的代码现在是正确的,磁带知道
丢失
来自
丢失
,但它不知道
丢失
来自
x
,因此无法计算梯度。