pytorch loss.backward问题:RuntimeError: element 0 of tensors does not require grad and does not have a

最近遇到了一个问题,在pytorch定义模型
训练过程中 ,反向传播时

loss.backward()

在上面这个未知报错

RuntimeError: element 0 of tensors does not require grad and does not have a grad_fn

该问题说明loss的梯度被关闭了,即loss的require_grad(False)

反观我的模型,我定义的模型套了两个模型,如:

class mymodel(nn.Module):
    def __init__(self):
        super(model,self).__init__()
        
        self.model1= ...
        for param in self.model1.parameters():    
            param.requires_grad = True
            
        self.model2= ...
        for param in self.model2.parameters():    
            param.requires_grad = False
     def forward(self):
     ...

这样mymodel的最后一个模型requires_grad = False,由于requires_grad=True 的作用是让 backward 可以追踪这个参数并且计算它的梯度。最开始定义你的输入是 requires_grad=True ,那么后续对应的输出也自动具有 requires_grad=True
则同理requires_grad=False,应该就会导致后面的参数requires_grad=True

在本例中,loss的计算时接着model2的参数的,model2的参数requires_grad = False,则loss的requires_grad = False,导致无法后向传播

解决方法:

loss.requires_grad_(True)  #这里应该是因为如果将最后一层的模型参数梯度关闭,则计算出来的loss也没有梯度,不能追踪,所以要将loss的梯度设置为True
loss.backward()

即在loss.backward()前增加语句让loss的梯度可以被追踪
解决问题

  • 17
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值