1.基于框架pytorch。先查看网络每层的名字p[0],将需要梯度更新的层的名字记下,替换以下代码中的’conv5_ft.conv.weight/bias’,将不需要梯度更新层的require_grad设为False。
for p in net.named_parameters():
if p[0] != 'conv5_ft.conv.weight' and p[0]!='conv5_ft.conv.bias': //should be changed
p[1].requires_grad=False
ps:如果有梯度,不更新,则该梯度会影响其他层的参数更新。
2.验证设置是否成功:
for xyz in net.parameters():
print(xyz.requires_grad)
3.最后一步,将require_grad=False的层筛掉,只对True层进行参数优化:
决定本层参数是否更新
optimizer = torch.optim.SGD(filter(lambda p: p.requires_grad, net.parameters()),lr=lr,momentum=cfg.momentum,weight_decay=cfg.weight_decay)
4.训练一段时间后验证是否成功:
利用net.named_parameters()输出训练前后某层参数p[1],看是否不同。