我有一个训练有素的模型,称为网络,最后一层(输出层)是具有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/