pytorch 如何冻结网络中的某些层,只训练其余部分?

现在的话是将VGG特征层全部冻掉,如果我想只冻结前几层,不全部冻结,该怎么做呢?

## 获取vgg16的特征提取层
vgg = vgg16.features
# 将vgg16的特征提取层参数冻结,不对其进行更新

for param in vgg.parameters:
    param.requires_grad_(False)

你可以看下这篇教程,讲的很详细。


另外的一些做法就是根据网络层的id来冻结(像yolov5的话就是前10层是backbone网络),从输入后的提一个卷积层0层开始计算。例如冻结1,2,6,8,9这五层

    freeze = [1,2,6,8,9]  # layers to freeze
    for k, v in model.named_parameters():
        v.requires_grad = True  # train all layers
        if  k in freeze:
            v.requires_grad = False

另外就是利用isinstance函数,冻结特定网络层名

 for k, v in model.named_parameters():
    if if isinstance(v, Conv)
        v.requires_grad = False
    if if isinstance(v, layer_10)
        v.requires_grad = False