将model的某一层设置为不参与更新
观看一下链接即可
https://blog.csdn.net/qq_41368074/article/details/107860126
也可看本人简述:
不参与更新就是不参与反向传播,即设置 requires_grad = False 即可
设置方式:
1 class Net(nn.Module): 2 def __init__(self): 3 super(Net, self).__init__() 4 self.conv1 = nn.Conv2d() 5 self.conv2 = nn.Conv2d() 6 self.fc1 = nn.Squential( 7 nn.Linear(), 8 nn.Linear(), 9 ReLU(inplace=True), 10 ) 11 self.classifier = nn.Linear()
冻结参数
1 def freeze(layer): 2 for child in layer.children(): 3 for param in child.parameters(): 4 param.requires_grad = False
同时不要忘记在迭代时也要告诉优化器哪些不迭代
1 optimizer.SGD(filter(lambda p: p.requires_grad, model.parameters()), lr=1e-5)
有的同学表示,我大部分层需要冻结,只有少部分层要训练,那这样一层一层的稍显麻烦,我们应该怎么做呢,还拿上面的模型举例,假设我的模型是按序定义的,则我只想训练classifier层,其余的统统冻结那么:
1 class Net(nn.Module): 2 def __init__(self): 3 super(Net, self).__init__() 4 self.conv1 = nn.Conv2d() 5 self.conv2 = nn.Conv2d() 6 self.fc1 = nn.Squential( 7 nn.Linear(), 8 nn.Linear(), 9 ReLU(inplace=True), 10 ) 11 12 for param in self.parameters(): 13 param.requires_grad = False 14 #这样for循环之前的参数都被冻结,其后的正常更新。 15 self.classifier = nn.Linear()
当然同样不要忘了在定义优化器时过滤。