pytorch optimizer小記


1.最簡單情況:

optimizer = SGD(net.parameters(), lr=0.1, weight_decay=0.05, momentum=0.9)

  查看一下optimizer參數具體情況:print(len(opt.param_groups))

會發現長度只有1,是一個只有一個元素的數組,因此,查看一下這個數組第一個元素的情況:

for i in opt.param_groups[0].keys():
    print(i)

  會顯示:

params
lr
momentum
dampening
weight_decay
nesterov

  這就是opt.param_groups[0]中參數,以鍵值對的形式存放的,若要更改學習率,可以直接:

opt.param_groups[0]['lr'] = 給定新值

  2.既然opt.param_groups列表的長度只有1,那為什么還要用列表的形式存放呢?那是因為列表的長度可以不止1:

opt = optim.Adam([{'params':model1.parameters(),'lr':0.01},
                        {'params':model2.parameters(),'lr':0.1},
                        ])

  一個優化器可以同時優化多個網絡參數,如上所示,此時opt.param_groups列表的長度為2

3.同理,可以對同一個網絡的不同層分別以不同學習率來優化

optimizer = optim.Adam([{'params':model.conv1.parameters(),'lr':0.2},
                        {'params':model.conv2.parameters(),'lr':0.2},
                        {'params':prelu_params,'lr':0.02},
                        {'params':rest_params,'lr':0.3}
                        ])
 

  

4.訓練時還可以固定某些層不訓練(參考:https://blog.csdn.net/qq_34914551/article/details/87699317):

model = Net()
for name, p in model.named_parameters():
    if name.startswith('conv1'):
        p.requires_grad = False
 
import torch.optim as optim
optimizer = optim.Adam(filter(lambda x: x.requires_grad is not False ,model.parameters()),lr= 0.2)

  

 


免責聲明!

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



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