我怎样才能得到pytorch中两个损失的梯度

How can I get the gradients of two losses in pytorch

我试图在以下代码片段中获取两个损失的梯度,但我得到的只是 None(AttributeError:'NoneType' 对象没有属性 'data')

img = img.to(device)
#img.requires_grad = True
input = model(img)
input_prediction = input.max(1, keepdim=True)[1]

btarget = torch.tensor(2).unsqueeze(0).to(device)
x_prime.requires_grad = True
x_prime_output = model(x_prime)
x_prime_pred =  x_prime_output.max(1, keepdim=True)[1]

l_target_loss = F.nll_loss(x_prime_output, btarget)
# model.zero_grad()
l_target_loss.retain_grad()
l_target_loss.backward(retain_graph = True)
target_grad = l_target_loss.grad.data

l_argmax_loss = F.nll_loss(x_prime_output, input_prediction.squeeze(0))
l_argmax_loss.retain_grad()
l_argmax_loss.backward()
l_argmax_grad = l_argmax_loss.grad.data

当我尝试获取 target_gradl_argmax_grad 时,我得到 None。

编辑:我实际上是在尝试获取 l_target_loss w.r.t 到输入 x 的梯度和 l_argmax_loss w.r.t 的梯度到输入 x 以及

您需要使用 retain_grad 保留该张量上的梯度,默认情况下它不会缓存在内存中:

>>> l_target_loss.retain_grad()
>>> l_target_loss.backward(retain_graph=True)