pytorch學習(十三)—學習率調整策略

學習率

學習速率(learning rate)是指導我們該如何通過損失函數的梯度調整網絡權重的超參數。學習率越低,損失函數的變化速度就越慢。雖然使用低學習率可以確保我們不會錯過任何局部極小值,但也意味着我們將花費更長的時間來進行收斂,特別是在被困在高原區域的情況下。


new_weight = existing_weight — learning_rate * gradient

圖1採用較小的學習率,梯度下降的速度慢;
圖2採用較大的學習率,梯度下降太快越過了最小值點,導致不收斂,甚至震盪。

目的

  • 瞭解pytorch中學習率調整的方法

測試環境

  • windows 10
  • Ananconda 3, python3.7
  • pytorch 1.0
  • pycharm

實驗/測試

pytorch中相關的API

關於學習率調整,pytorch提供了torch.optim.lr_scheduler

image.png

 

主要提供了幾個類:

  • torch.optim.lr_scheduler.LambdaLr
  • torch.optim.lr_scheduler.StepLR
  • torch.optim.lr_scheduler.MultiStepLR
  • torch.optim.lr_scheduler.ExponentialLR
  • torch.optim.lr_sheduler.CosineAnneaingLR
  • torch.optim.lr_scheduler.ReduceLROnPlateau

1. torch.optim.lr_scheduler.StepLR

.代碼

import torch
import torch.optim as optim
from torch.optim import lr_scheduler
from torchvision.models import AlexNet
import matplotlib.pyplot as plt


model = AlexNet(num_classes=2)
optimizer = optim.SGD(params=model.parameters(), lr=0.05)

# lr_scheduler.StepLR()
# Assuming optimizer uses lr = 0.05 for all groups
# lr = 0.05     if epoch < 30
# lr = 0.005    if 30 <= epoch < 60
# lr = 0.0005   if 60 <= epoch < 90

scheduler = lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.1)
plt.figure()
x = list(range(100))
y = []
for epoch in range(100):
    scheduler.step()
    lr = scheduler.get_lr()
    print(epoch, scheduler.get_lr()[0])
    y.append(scheduler.get_lr()[0])

plt.plot(x, y)

 

 0<epoch<30, lr = 0.05
30<=epoch<60, lr = 0.005
60<=epoch<90, lr = 0.0005

torch.optim.lr_scheduler.MultiStepLR

StepLR相比,MultiStepLR可以設置指定的區間

  • 代碼
# ---------------------------------------------------------------
# 可以指定區間
# lr_scheduler.MultiStepLR()
#  Assuming optimizer uses lr = 0.05 for all groups
# lr = 0.05     if epoch < 30
# lr = 0.005    if 30 <= epoch < 80
#  lr = 0.0005   if epoch >= 80
print()
plt.figure()
y.clear()
scheduler = lr_scheduler.MultiStepLR(optimizer, [30, 80], 0.1)
for epoch in range(100):
    scheduler.step()
    print(epoch, 'lr={:.6f}'.format(scheduler.get_lr()[0]))
    y.append(scheduler.get_lr()[0])

plt.plot(x, y)
plt.show()

 

 

torch.optim.lr_scheduler.ExponentialLR

指數衰減

  • 代碼
  • scheduler = lr_scheduler.ExponentialLR(optimizer, gamma=0.9)
    print()
    plt.figure()
    y.clear()
    for epoch in range(100):
        scheduler.step()
        print(epoch, 'lr={:.6f}'.format(scheduler.get_lr()[0]))
        y.append(scheduler.get_lr()[0])
    
    plt.plot(x, y)
    plt.show()

原文鏈接:

https://www.jianshu.com/p/a20d5a7ed6f3 

發佈了94 篇原創文章 · 獲贊 24 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章