首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么gpu中的张量不能使用毕业生?

为什么gpu中的张量不能使用毕业生?
EN

Stack Overflow用户
提问于 2022-09-05 06:04:09
回答 1查看 74关注 0票数 5
代码语言:javascript
复制
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是可用的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-05 07:20:09

不是叶张量的张量的.grad属性正在被访问。它的.grad属性不会在autograd.backward()期间填充。如果确实需要非叶张量的梯度,请在非叶张量上使用.retain_grad()。如果您错误地访问非叶张,请确保您访问叶张量。有关更多信息,请参见github.com/py手电/py手电/拉/30531。

代码语言:javascript
复制
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的原始值。

你可以用

代码语言:javascript
复制
a = torch.nn.Parameter(torch.ones(5, 5))
a.cuda()

代码语言:javascript
复制
a = torch.nn.Parameter(torch.ones(5, 5, device='cuda'))
代码语言:javascript
复制
a = torch.nn.Parameter(torch.ones(5, 5).cuda())

或显式请求保留a的梯度

代码语言:javascript
复制
a.retain_grad() # added this line

删除中间变量的梯度可以节省大量内存。因此,最好只在需要的地方保留渐变。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73605095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档