标题不言自明。我有以下
import torch
x = torch.tensor([3., 4.], requires_grad=True)
A = torch.tensor([[x[0], x[1]],
[x[1], x[0]]], requires_grad=True)
f = torch.norm(A)
f.backward()
我想计算f相对于x的梯度,但如果我键入x.grad
,我只得到None
。如果我使用更明确的命令torch.autograd.grad(f, x)
而不是f.backward()
,我会得到
RuntimeError:其中一个区分张量似乎没有已在图表中使用。如果需要,则设置allow_unused=True行为
问题可能是,当您获取叶张量的切片时,它会返回一个非叶张量,如下所示:
>>> x.is_leaf
True
>>> x[0].is_leaf
False
现在的情况是,x不是添加到图中的,而是x[0]。
试试这个:
>>> import torch
>>>
>>> x = torch.tensor([3., 4.], requires_grad=True)
>>> xt = torch.empty_like(x).copy_(x.flip(0))
>>> A = torch.stack([x,xt])
>>>
>>> f = torch.norm(A)
>>> f.backward()
>>>
>>> x.grad
tensor([0.8485, 1.1314])
不同的是PyTorch知道要将x添加到图中,所以f.backward((填充它的梯度。在这里,你会发现一些不同的方式来复制张量及其对图的影响。