如何计算仅一个输出单元的梯度?



我有一个名为net的训练模型,最后一层(输出层(是一个具有10个单元和线性激活功能的密集层。 当我像这样计算梯度时,一切正常:

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

输出为 TF。具有形状 (1, 10( 的张量。

现在,当我尝试仅从 10 个输出单元中的一个计算梯度时,grad 是 None,例如,我对第一个单元进行如下计算:

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

输出[0,0] 是一个 tf。张肌。

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

这其实很简单:您需要在磁带上下文中执行所有操作,包括索引。意义:

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

这应该按预期工作。请记住,即使是像索引到张量这样简单的事情也是一种"操作",它定义了梯度,需要反向传播。如果在磁带上下文之外执行此操作,则磁带基本上会"失去"操作序列的跟踪,并且无法再计算梯度。通过将索引移动到上下文中,问题就解决了。

最新更新