【发布时间】:2019-05-10 11:55:03
【问题描述】:
我正在尝试计算网络的雅可比损失(即执行双反向传播),我收到以下错误: RuntimeError:梯度计算所需的变量之一已被就地操作修改
我的代码中找不到inplace操作,所以不知道要修复哪一行。
*最后一行出现错误: loss3.backward()
inputs_reg = Variable(data, requires_grad=True)
output_reg = self.model.forward(inputs_reg)
num_classes = output.size()[1]
jacobian_list = []
grad_output = torch.zeros(*output_reg.size())
if inputs_reg.is_cuda:
grad_output = grad_output.cuda()
jacobian_list = jacobian.cuda()
for i in range(10):
zero_gradients(inputs_reg)
grad_output.zero_()
grad_output[:, i] = 1
jacobian_list.append(torch.autograd.grad(outputs=output_reg,
inputs=inputs_reg,
grad_outputs=grad_output,
only_inputs=True,
retain_graph=True,
create_graph=True)[0])
jacobian = torch.stack(jacobian_list, dim=0)
loss3 = jacobian.norm()
loss3.backward()
【问题讨论】:
-
grad_output.zero_()似乎是就地操作。您可能在self.model中进行了就地操作。 -
grad_output.zero_()是就地操作。在 PyTorch 中,就地操作以下划线结尾。我想你想写 `grad_output.zero_grad() -
在将新列(对应于我希望计算梯度的输出)设置为 1 之前,我需要将 grad_output 归零。所以我将 grad_output.zero_() 更改为 grad_output[:,i-1] = 0 并没有帮助。
-
实际上我上面描述的是将一个就地操作替换为另一个。