上一篇迁移学习的文章下,有朋友问在fine-tune的时候如何固定某些层不参与训练,下去研究并实验了一下,在这儿总结一下:
pytorch中关于网络的反向传播操作是基于Variable对象,Variable中有一个参数requires_grad,将requires_grad=False,网络就不会对该层计算梯度。
在用户手动定义Variable时,参数requires_grad默认值是False。而在Module中的层在定义时,相关Variable的requires_grad参数默认是True。
在训练时如果想要固定网络的底层,那么可以令这部分网络对应子图的参数requires_grad为False。这样,在反向过程中就不会计算这些参数对应的梯度。
冻结模型参考链接:
https://discuss.pytorch.org/t/how-the-pytorch-freeze-network-in-some-layers-only-the-rest-of-the-training/7088discuss.pytorch.orgmodel_ft = models.resnet50(pretrained=True) #读入resnet50模型
ct = 0
for child in model_ft.children():
ct += 1
if ct < 7:
for param in child.parameters():
param.requires_grad = False
然后需要在优化器中filter一下
optimizer
那么mo