将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()

当然同样不要忘了在定义优化器时过滤。

相关