1.最簡單情況:
opt = optim.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.同理,可以對同一個網絡的不同層分別以不同學習率來優化
opt = optim.Adam([{'params':model.conv1.parameters(),'lr':0.001},
{'params':model.conv2.parameters(),'lr':0.002}
])
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,model.parameters()),lr= 0.2)