簡體   English   中英

為什么 grad 對於 gpu 中的張量不可用

[英]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.gradNone盡管a.requires_gradTrue 但是如果代碼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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM