前言
在深度学习领域,经常需要使用其他人已训练好的模型进行改进或微调,这个时候我们会加载已有的预训练模型文件的参数,如果网络结构不变,希望使用新数据微调部分网络参数。这时我们则需要冻结部分参数,禁止其更新。
做法
做法非常简单。
参考这篇博客:https://blog.csdn.net/HUSTHY/article/details/104006106
其实只需要设置model的parameter的requires_grad=False,如下下面:
for name, param in model.named_parameters(): #遍历模型的所有层
if param.requires_grad:
print(name)
print(param)
if name=='backbone.layers.11.ffn.layers.0.0.bias':
param.requires_grad = False #固定该层参数
对优化器的设置
有些文章说需要设置optimizer,让optimizer不去传播这模型,比如参考博客中提到的:
#只对p中requires_grad=True代码进行训练,加过滤器filter把requires_grad = False的参数过滤掉,在训练的时候,不会更新这些参数
optimizer = torch.optim.Adam(filter(lambda p: p.requires_grad, model.parameters()), lr=0.00001)
我发现在后面较高的pytorch(>1.8)版本上不需要这样,只需要正常设置optimizer即可:
optimizer = torch.optim.Adam(model.parameters()), lr=0.00001)