a = torch.nn.Parameter(torch.ones(5, 5))
a = a.cuda()
print(a.requires_grad)
b = a
b = b - 2
print('a ', a)
print('b ', b)
loss = (b - 1).pow(2).sum()
loss.backward()
print(a.grad)
print(b.grad)执行代码后,a.grad为None,而a.requires_grad为True。但是,如果删除了代码a = a.cuda(),则在丢失后a.grad是可用的。
发布于 2022-09-05 07:20:09
不是叶张量的张量的.grad属性正在被访问。它的.grad属性不会在autograd.backward()期间填充。如果确实需要非叶张量的梯度,请在非叶张量上使用.retain_grad()。如果您错误地访问非叶张,请确保您访问叶张量。有关更多信息,请参见github.com/py手电/py手电/拉/30531。
a = torch.nn.Parameter(torch.ones(5, 5))
a = a.cuda()
print(a.requires_grad)
b = a
b = b - 2
print('a ', a)
print('b ', b)
loss = (b - 1).pow(2).sum()
a.retain_grad() # added this line
loss.backward()
print(a.grad)这是因为您的行a = a.cuda()覆盖了a的原始值。
你可以用
a = torch.nn.Parameter(torch.ones(5, 5))
a.cuda()或
a = torch.nn.Parameter(torch.ones(5, 5, device='cuda'))a = torch.nn.Parameter(torch.ones(5, 5).cuda())或显式请求保留a的梯度
a.retain_grad() # added this line删除中间变量的梯度可以节省大量内存。因此,最好只在需要的地方保留渐变。
https://stackoverflow.com/questions/73605095
复制相似问题