如何用scheduler實(shí)現(xiàn)learning-rate學(xué)習(xí)率動(dòng)態(tài)變化
記錄下schedule設(shè)置學(xué)習(xí)率變化過程的使用和方法
優(yōu)化器optimizer
pytorch提供數(shù)種優(yōu)化器的實(shí)現(xiàn),優(yōu)化器根據(jù)計(jì)算圖的結(jié)構(gòu),進(jìn)行梯度計(jì)算,根據(jù)loss信息實(shí)現(xiàn)自動(dòng)的BP過程。
常用的就是 Adam ,將網(wǎng)絡(luò)參數(shù)傳入,設(shè)置初始的 learning-rate 學(xué)習(xí)率即可:
optimizer = torch.optim.Adam(model.parameters(), lr=args.learn_rate)
在訓(xùn)練中:
optimizer.zero_grad() loss.backward() optimizer.step()
即可實(shí)現(xiàn)BP環(huán)節(jié)。
scheduler
lr_scheduler 提供了隨著訓(xùn)練的迭代次數(shù)對(duì)optimizer的學(xué)習(xí)率進(jìn)行修改的類和方法,通過在循環(huán)過程中調(diào)用:
scheduler.step()
每次調(diào)用step方法,類中內(nèi)置的計(jì)數(shù)器就會(huì)+1,即 epoch 輪次數(shù)增加。
根據(jù)不同的當(dāng)前 epoch ,scheduler類會(huì)對(duì)optimizer中的learning-rate進(jìn)行修改。
利用 optimizer.param_groups[0]['lr'] 可查看當(dāng)前的學(xué)習(xí)率大小。
這邊整理三個(gè)常用的類:LambdaLR,StepLR和MultiStepLR。
個(gè)人覺得這三種就能應(yīng)對(duì)大部分的調(diào)整需求了。
LambdaLR
完整的類包為 torch.optim.lr_scheduler.LambdaLR 。
該類實(shí)現(xiàn)的學(xué)習(xí)率變化策略為當(dāng)前學(xué)習(xí)率乘以值 λ , λ 的大小由一個(gè)自定函數(shù)確定,該函數(shù)輸入為epoch,即類中的循環(huán)次數(shù)計(jì)數(shù)(也就是調(diào)用 scheduler.step() 的次數(shù))。
learing-rate = λ * learing-rate
LambdaLR(optimizer, lr_lambda, last_epoch=-1)
其中 lr_lambda 為λ的計(jì)算函數(shù)。
給個(gè)使用例子:
# 簡(jiǎn)單寫個(gè)Moudle生成parameter
class MyModel(nn.Module):
def __init__(self):
super().__init__()
self.liner = nn.Linear(10, 10)
model = MyModel()
# 生成optimizer
optimizer = torch.optim.Adam(model.parameters(), lr=0.01)計(jì)算函數(shù):
def lb_func(epoch):
return 1 / (epoch + 1)在循環(huán)中使用:
lambda_scheduler = torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda=lb_func)
for epoch in range(10):
optimizer.zero_grad()
optimizer.step()
print("當(dāng)前l(fā)r為{}".format(optimizer.param_groups[0]['lr']))
lambda_scheduler.step()輸出:
當(dāng)前l(fā)r為0.01
當(dāng)前l(fā)r為0.005
當(dāng)前l(fā)r為0.003333333333333333
當(dāng)前l(fā)r為0.0025
當(dāng)前l(fā)r為0.002
當(dāng)前l(fā)r為0.0016666666666666666
當(dāng)前l(fā)r為0.0014285714285714286
當(dāng)前l(fā)r為0.00125
當(dāng)前l(fā)r為0.0011111111111111111
當(dāng)前l(fā)r為0.001
當(dāng)scheduler調(diào)用step之后,就能修改對(duì)應(yīng)的optimizer的lr參數(shù),從而改變整體訓(xùn)練的學(xué)習(xí)率。
StepLR
完整的類包為 torch.optim.lr_scheduler.StepLR 。
該類的學(xué)習(xí)策略為設(shè)定某個(gè)間隔 step_size ,在經(jīng)過間隔次數(shù)的循環(huán)之后,就將學(xué)習(xí)率乘以γ得到新的學(xué)習(xí)率。
learning_rate = learning_rate * (γ ^ (epoch//step_size))
StepLR(optimizer, step_size, gamma)
給個(gè)使用例子:
step_scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=3, gamma=0.1)
for epoch in range(10):
optimizer.zero_grad()
optimizer.step()
print("當(dāng)前l(fā)r為{}".format(optimizer.param_groups[0]['lr']))
step_scheduler.step()輸出:
當(dāng)前l(fā)r為0.01
當(dāng)前l(fā)r為0.01
當(dāng)前l(fā)r為0.01
當(dāng)前l(fā)r為0.001
當(dāng)前l(fā)r為0.001
當(dāng)前l(fā)r為0.001
當(dāng)前l(fā)r為0.0001
當(dāng)前l(fā)r為0.0001
當(dāng)前l(fā)r為0.0001
當(dāng)前l(fā)r為1e-05
設(shè)定間隔和γ值即可。
MultiStepLR
完整的類包為 torch.optim.lr_scheduler.MultiStepLR 。
這個(gè)類更新策略和step差不多,但其不一定為等間隔更新,有里程碑 milestones 參數(shù),用來(lái)傳入更新的輪次list,每次迭代次數(shù)到達(dá) milestones 中的某值,即進(jìn)行學(xué)習(xí)率的更新。
MultiStepLR(optimizer, milestones, gamma)
milestones 需要順序排列。
給個(gè)使用例子:
multi_scheduler = torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones=[2, 4, 6, 8], gamma=0.1)
for epoch in range(10):
optimizer.zero_grad()
optimizer.step()
print("當(dāng)前l(fā)r為{}".format(optimizer.param_groups[0]['lr']))
multi_scheduler.step()輸出:
當(dāng)前l(fā)r為0.01
當(dāng)前l(fā)r為0.01
當(dāng)前l(fā)r為0.001
當(dāng)前l(fā)r為0.001
當(dāng)前l(fā)r為0.0001
當(dāng)前l(fā)r為0.0001
當(dāng)前l(fā)r為1e-05
當(dāng)前l(fā)r為1e-05
當(dāng)前l(fā)r為1.0000000000000002e-06
當(dāng)前l(fā)r為1.0000000000000002e-06
last_epoch
scheduler初始化的時(shí)候都有個(gè) last_epoch 的參數(shù),當(dāng)訓(xùn)練中止保存后,重開的時(shí)候就會(huì)調(diào)用 last_epoch 作為當(dāng)前epoch,以繼續(xù)訓(xùn)練,默認(rèn)為-1從頭開始。
參考文檔
lr_scheduler文檔:https://pytorch.org/docs/stable/_modules/torch/optim/lr_scheduler.html
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python實(shí)現(xiàn)機(jī)器學(xué)習(xí)之多元線性回歸
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)機(jī)器學(xué)習(xí)之多元線性回歸,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-09-09
Python簡(jiǎn)單實(shí)現(xiàn)socket信息發(fā)送與監(jiān)聽功能示例
這篇文章主要介紹了Python簡(jiǎn)單實(shí)現(xiàn)socket信息發(fā)送與監(jiān)聽功能,結(jié)合實(shí)例形式分析了Python基于socket構(gòu)建客戶端與服務(wù)器端通信相關(guān)操作技巧,需要的朋友可以參考下2018-01-01
從基礎(chǔ)到高級(jí)解析Pandas?DataFrame數(shù)據(jù)操作的完整指南
本文系統(tǒng)梳理了Pandas?DataFrame的五大核心操作能力,包括數(shù)據(jù)訪問、修改、轉(zhuǎn)換、聚合和高級(jí)處理,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下2026-02-02
python+tkinter實(shí)現(xiàn)一個(gè)簡(jiǎn)單的秒鐘
這篇文章主要為大家詳細(xì)介紹了Python如何利用tkinter實(shí)現(xiàn)一個(gè)簡(jiǎn)單的秒鐘,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴可以自己動(dòng)手嘗試一下2024-02-02
Python進(jìn)階核心之__new__與__init__魔法函數(shù)的深度解析與實(shí)戰(zhàn)
在Python高級(jí)開發(fā)的面試考場(chǎng)中,__new__與__init__這對(duì)魔法函數(shù)的區(qū)別始終是高頻考點(diǎn),下面我們就來(lái)深入剖析這兩個(gè)魔法函數(shù)的本質(zhì)區(qū)別和執(zhí)行邏輯吧2026-03-03
python使用selenium模擬瀏覽器進(jìn)入好友QQ空間留言功能
這篇文章主要介紹了python使用selenium模擬瀏覽器進(jìn)入好友QQ空間留言,在本文實(shí)現(xiàn)過程中需要注意的是留言框和發(fā)表按鈕在不同的frame,發(fā)表在外面的一層,具體實(shí)現(xiàn)過程跟隨小編一起看看吧2022-04-04
PyQt5+QtChart實(shí)現(xiàn)繪制曲線圖
QChart是一個(gè)QGraphicScene中可以顯示的QGraphicsWidget。本文將利用QtChart實(shí)現(xiàn)曲線圖的繪制,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-12-12
python 刪除excel表格重復(fù)行,數(shù)據(jù)預(yù)處理操作
這篇文章主要介紹了python 刪除excel表格重復(fù)行,數(shù)據(jù)預(yù)處理操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2020-07-07

