日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

pytorch 动态调整学习率 重点

發布時間:2023/11/28 生活经验 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 pytorch 动态调整学习率 重点 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

深度煉丹如同燉排骨一般,需要先大火全局加熱,緊接著中火燉出營養,最后轉小火收汁。
本文給出煉丹中的 “火候控制器”-- 學習率的幾種調節方法,框架基于?pytorch

1. 自定義根據 epoch 改變學習率。

這種方法在開源代碼中常見,此處引用 pytorch 官方實例中的代碼?adjust_lr

def adjust_learning_rate(optimizer, epoch):"""Sets the learning rate to the initial LR decayed by 10 every 30 epochs"""lr = args.lr * (0.1 ** (epoch // 30))for param_group in optimizer.param_groups:param_group['lr'] = lr

注釋:在調用此函數時需要輸入所用的 optimizer 以及對應的 epoch ,并且 args.lr 作為初始化的學習率也需要給出。

使用代碼示例:

optimizer = torch.optim.SGD(model.parameters(),lr = args.lr,momentum = 0.9)
for epoch in range(10):adjust_learning_rate(optimizer,epoch)train(...)validate(...)

2. 針對模型的不同層設置不同的學習率

當我們在使用預訓練的模型時,需要對分類層進行單獨修改并進行初始化,其他層的參數采用預訓練的模型參數進行初始化,這個時候我們希望在進行訓練過程中,除分類層以外的層只進行微調,不需要過多改變參數,因此需要設置較小的學習率。而改正后的分類層則需要以較大的步子去收斂,學習率往往要設置大一點以 resnet101 為例,分層設置學習率。

model = torchvision.models.resnet101(pretrained=True)
large_lr_layers = list(map(id,model.fc.parameters()))
small_lr_layers = filter(lambda p:id(p) not in large_lr_layers,model.parameters())
optimizer = torch.optim.SGD([{"params":large_lr_layers},{"params":small_lr_layers,"lr":1e-4}],lr = 1e-2,momenum=0.9)

注:large_lr_layers 學習率為 1e-2,small_lr_layers 學習率為 1e-4,兩部分參數共用一個 momenum

3. 根據具體需要改變 lr

以前使用 keras 的時候比較喜歡 ReduceLROnPlateau 可以根據 損失或者 準確度的變化來改變 lr。最近發現 pytorch 也實現了這一個功能。

class torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', factor=0.1, patience=10, verbose=False, threshold=0.0001, threshold_mode='rel', cooldown=0, min_lr=0, eps=1e-08)

以 acc 為例,當 mode 設置為 “max” 時,如果 acc 在給定 patience 內沒有提升,則以 factor 的倍率降低 lr。

使用方法示例:

optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
scheduler = ReduceLROnPlateau(optimizer, 'max',verbose=1,patience=3)
for epoch in range(10):train(...)val_acc = validate(...)# 降低學習率需要在給出 val_acc 之后scheduler.step(val_acc)

4. 手動設置 lr 衰減區間

使用方法示例

def adjust_learning_rate(optimizer, lr):for param_group in optimizer.param_groups:param_group['lr'] = lrfor epoch in range(60):        lr = 30e-5if epoch > 25:lr = 15e-5if epoch > 30:lr = 7.5e-5if epoch > 35:lr = 3e-5if epoch > 40:lr = 1e-5adjust_learning_rate(optimizer, lr)

5. 余弦退火

論文:?SGDR: Stochastic Gradient Descent with Warm Restarts

使用方法示例

epochs = 60
optimizer = optim.SGD(model.parameters(),lr = config.lr,momentum=0.9,weight_decay=1e-4) 
scheduler = lr_scheduler.CosineAnnealingLR(optimizer,T_max = (epochs // 9) + 1)
for epoch in range(epochs):scheduler.step(epoch)

目前最常用的也就這么多了,當然也有很多其他類別,詳情見?how-to-adjust-learning-rate

參考文獻

  • how-to-adjust-learning-rate
  • adjust_lr
標簽:?pytorch

總結

以上是生活随笔為你收集整理的pytorch 动态调整学习率 重点的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。