最近遇到了一个问题,在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的梯度可以被追踪
解决问题