我有一个训练有素的模型,称为网络,最后一层(输出层)是具有10个单元和线性激活函数的密集层。当我这样计算梯度时,一切正常:

   with tf.GradientTape(persistent=True) as tape:
        output = net(x)
   grad = tape.gradient(output, x)


输出是形状为(1,10)的tf.Tensor。

现在,当我尝试仅从10个输出单位grad中的一个计算梯度时,将其设置为None,例如,对于第一个单位,我这样计算:

   with tf.GradientTape(persistent=True) as tape:
        output = net(x)
   grad = tape.gradient(output[0,0], x)


output [0,0]是一个tf.Tensor。

计算此梯度的正确方法是什么?

最佳答案

实际上这很简单:您需要在磁带上下文中做所有事情,包括索引。含义:

with tf.GradientTape(persistent=True) as tape:
     output = net(x)[0, 0]
grad = tape.gradient(output, x)


这应该按预期工作。请记住,即使是像张量索引这样的简单操作,也是“操作”,它已定义了渐变并且需要反向传播。如果在磁带环境之外进行操作,则磁带基本上会“失去对”操作序列的跟踪,并且不再能够计算梯度。通过将索引移到上下文中,可以解决问题。

关于python - 如何计算仅一个输出单位的梯度?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59922755/

10-11 06:47