我的简单代码:
import torch
x = torch.randn(4, requires_grad=True).cuda()
y = torch.randn(4, requires_grad=True).cuda()
z = torch.zeros(4)
z = torch.clone(x)
z.retain_grad()
h = (z + y) * z
l = torch.randn(4).cuda()
loss = (l - h).pow(2).sum()
loss.backward()
print('x.grad=', x.grad)
print('z.grad=', z.grad)
输出:
x.grad= None
z.grad= tensor([-15.3401, -3.2623, -2.1670, 0.1410], device='cuda:0')
为什么x.grad为None但与z.grad不同?
如果我希望它们相同怎么办?
最佳答案
如果要保留张量x的等级,则需要在声明x之后调用x.retain_grad()
。