现在的话是将VGG特征层全部冻掉,如果我想只冻结前几层,不全部冻结,该怎么做呢?
## 获取vgg16的特征提取层
vgg = vgg16.features
# 将vgg16的特征提取层参数冻结,不对其进行更新
for param in vgg.parameters:
param.requires_grad_(False)
现在的话是将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