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)