我怎样才能得到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_grad
和 l_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)
我试图在以下代码片段中获取两个损失的梯度,但我得到的只是 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_grad
和 l_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)