PyTorch优化器失效及RuntimeError报错原因咨询(附代码)
问题原因与解决办法
报错核心原因
你代码里的w、BH、WH、BO这些要训练的参数,默认是不计算梯度的(PyTorch新建张量时requires_grad默认是False)。反向传播的本质是顺着计算图倒推每个参数对loss的影响,只有开启梯度的张量才会被PyTorch记录运算过程(也就是报错里说的grad_fn)。这些参数没开梯度,loss.backward()自然找不到梯度信息,就会抛出那个错误。
为什么设置loss_fin.requires_grad=True没用
loss是模型输出经过运算得到的结果,就算你强制给它开梯度,源头的参数本身没开梯度,整个计算链里还是没有任何梯度记录。优化器更新参数需要的是每个参数自己的梯度,不是loss的梯度,所以这么做只会让代码不报错,但参数根本不会被更新。
解决办法
定义参数的时候,给每个参数加上requires_grad=True,让PyTorch知道要追踪它们的梯度:
w = torch.rand(3,4, requires_grad=True) BH = torch.rand(3, requires_grad=True) WH = torch.rand(3, requires_grad=True) BO = torch.rand(1, requires_grad=True)
另外你代码里的x没定义,运行前要补上输入,比如x = torch.rand(4)(和w的维度匹配)。
内容的提问来源于stack exchange,提问作者lvilv
相关产品推荐
相关产品推荐

