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的梯度可以被追踪
解决问题

你可能感兴趣的:(pytorch,解决方案,pytorch,深度学习,python)