一、原理:
要固定训练网络的哪几层,只需要找到这几层参数(parameter),然后将其 .requires_grad
属性设置为 False
即可。
二、代码:
# 根据参数层的 name 来进行冻结
unfreeze_layers = ["text_id"] # 用列表
# 设置冻结参数:
for name, param in model.named_parameters():# print(name, param.shape)# 错误判定:# if name.split(".")[0] in unfreeze_layers: # 不要用in来判定,因为"id"也在"text_id"的in中。# 正确判定:for unfreeze_layer in unfreeze_layers:if name.split(".")[0] != unfreeze_layer:param.requires_grad = Falseprint(name, param.requires_grad)else:print(name, param.requires_grad)
# 冻结整个网络
for param in self.model.parameters():param.requires_grad = False
# 查看冻结参数与否:
for name, param in self.clip_model.named_parameters():print(name, param.requires_grad)
参考文章
- 知乎讨论