pytorch optimizer小記

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)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章