pytorch 模型不同部分使用不同學習率


ref: https://blog.csdn.net/weixin_43593330/article/details/108491755

在設置optimizer時, 只需要參數分為兩個部分, 並分別給定不同的學習率lr。

base_params = list(map(id, net.backbone.parameters()))
logits_params = filter(lambda p: id(p) not in base_params, net.parameters())
params = [
    {"params": logits_params, "lr": config.lr},
    {"params": net.backbone.parameters(), "lr": config.backbone_lr},
]
optimizer = torch.optim.SGD(params, momentum=config.momentum, weight_decay=config.weight_decay)

需要注意的是沒有單獨設置如果params中沒有單獨加上"lr"則默認使用全局學習率。需要注意,這里base_params的list其實是這些參數的id地址,是int值,不可直接用於optimizer進行優化。

1、選擇要調整的學習率對應的層,這里以conv5為例

net = net()
lr = 0.001
 
conv5_params = list(map(id, net.conv5.parameters()))
base_params = filter(lambda p: id(p) not in conv5_params, net.parameters())
optimizer = torch.optim.SGD([
            {'params': base_params},
            {'params': net.conv5.parameters(), 'lr': lr * 100}], lr=lr, momentum=0.9)

2、如果要調整多個層的學習率,以conv4和conv5為例

conv5_params = list(map(id, net.conv5.parameters()))
conv4_params = list(map(id, net.conv4.parameters()))
base_params = filter(lambda p: id(p) not in conv5_params + conv4_params, net.parameters())
params = [{'params': base_params},
          {'params': net.conv5.parameters(), 'lr': lr * 100},
          {'params': net.conv4.parameters(), 'lr': lr * 100}]
optimizer = torch.optim.SGD(params, lr=lr, momentum=0.9)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM