将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()
当然同样不要忘了在定义优化器时过滤。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异