[英]Why the grad is unavailable for the tensor in gpu
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
在 loss 后可用。
正在訪問不是葉張量的張量的 .grad 屬性。 在 autograd.backward() 期間不會填充 its.grad 屬性。 如果您確實想要非葉張量的梯度,請在非葉張量上使用.retain_grad()。 如果您錯誤地訪問了非葉張量,請確保您訪問的是葉張量。 有關更多信息,請參閱 github.com/pytorch/pytorch/pull/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
擦除中間變量的梯度可以節省大量的 memory。 所以最好只在需要的地方保留漸變。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.