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)
