Pytorch反向传播梯度始终为None

原因

可能在将需要求梯度的tensor放置在cuda上时出错,如

import torch

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

x = torch.rand(10, 3).to(device)
w = torch.rand(3, 1, requires_grad=True).to(device)
t = (x @ w).sum()
t.backward()
print(w.grad)

# return: None

错误原因:对需要求梯度的张量做了一次to(device)导致叶节点发生变化

一种处理方式如下:

# device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
device = torch.device('cpu')

torch.manual_seed(123)
x = torch.rand(10, 3).to(device)
w = torch.rand(3, 1, requires_grad=True)
w1 = w.to(device)
t = (x @ w1).sum()
t.backward()
print(w.grad)

# return: 
# tensor([[4.4321],
        [4.1784],
        [5.2859]])

这种方式看似work,实际上在写训练模块时,要将w1写在循环内,后续梯度求导就会出现问题,参数得不到更新

正确的处理方式

直接利用人家写好的接口就行啦,别花里胡哨的,.cuda() ,to(device)的。

import torch

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

torch.manual_seed(123)
x = torch.rand(10, 3).to(device)
w = torch.rand(3, 1, requires_grad=True, device=device)
t = (x @ w).sum()
t.backward()
print(w.grad)

# return:
# tensor([[4.4321],
         [4.1784],
         [5.2859]], device='cuda:0')

这样用就不会有什么问题了。

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值