Ein*_*nav 2 backpropagation pytorch
我正在尝试计算网络 jacobian 上的损失(即执行双重反向传播),并且出现以下错误:RuntimeError:梯度计算所需的变量之一已被原位操作修改
我在我的代码中找不到就地操作,所以我不知道要修复哪一行。
*错误发生在最后一行: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()
Run Code Online (Sandbox Code Playgroud)
grad_output.zero_()就位, 也是如此grad_output[:, i-1] = 0。就地意味着“修改张量而不是返回应用了修改的新张量”。一个未就地解决方案的示例是torch.where。将第一列归零的示例
import torch
t = torch.randn(3, 3)
ixs = torch.arange(3, dtype=torch.int64)
zeroed = torch.where(ixs[None, :] == 1, torch.tensor(0.), t)
zeroed
tensor([[-0.6616, 0.0000, 0.7329],
[ 0.8961, 0.0000, -0.1978],
[ 0.0798, 0.0000, -1.2041]])
t
tensor([[-0.6616, -1.6422, 0.7329],
[ 0.8961, -0.9623, -0.1978],
[ 0.0798, -0.7733, -1.2041]])
Run Code Online (Sandbox Code Playgroud)
请注意如何t保留它之前的值并zeroed具有您想要的值。
| 归档时间: |
|
| 查看次数: |
12712 次 |
| 最近记录: |