Pytorch學習率更新

如需了解示例完整代碼及其后續(xù)內(nèi)容請訪問: https://www.emperinter.info/2020/08/01/learning-rate-in-pytorch/

緣由

自己在嘗試了官方的代碼后就想提高訓(xùn)練的精度就想到了調(diào)整學習率玲销,但固定的學習率肯定不適合訓(xùn)練就嘗試了幾個更改學習率的方法输拇,但沒想到居然更差摘符!可能有幾個學習率沒怎么嘗試吧!

更新方法

直接修改optimizer中的lr參數(shù)贤斜;

  • 定義一個簡單的神經(jīng)網(wǎng)絡(luò)模型:y=Wx+b
import torch
import matplotlib.pyplot as plt
%matplotlib inline
from torch.optim import *
import torch.nn as nn

class net(nn.Module):
    def __init__(self):
        super(net,self).__init__()
        self.fc = nn.Linear(1,10)
    def forward(self,x):
        return self.fc(x)
  • 直接更改lr的值
model = net()
LR = 0.01
optimizer = Adam(model.parameters(),lr = LR)
lr_list = []
for epoch in range(100):
    if epoch % 5 == 0:
        for p in optimizer.param_groups:
            p['lr'] *= 0.9
    lr_list.append(optimizer.state_dict()['param_groups'][0]['lr'])
plt.plot(range(100),lr_list,color = 'r')

關(guān)鍵是如下兩行能達到手動階梯式更改,自己也可按需求來更改變換函數(shù)

for p in optimizer.param_groups:
    p['lr'] *= 0.9

利用lr_scheduler()提供的幾種衰減函數(shù)

  • torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda, last_epoch=-1)
參數(shù) 含義
lr_lambda 會接收到一個int參數(shù):epoch逛裤,然后根據(jù)epoch計算出對應(yīng)的lr瘩绒。如果設(shè)置多個lambda函數(shù)的話,會分別作用于Optimizer中的不同的params_group
import numpy as np 
lr_list = []
model = net()
LR = 0.01
optimizer = Adam(model.parameters(),lr = LR)
lambda1 = lambda epoch:np.sin(epoch) / epoch
scheduler = lr_scheduler.LambdaLR(optimizer,lr_lambda = lambda1)
for epoch in range(100):
    scheduler.step()
    lr_list.append(optimizer.state_dict()['param_groups'][0]['lr'])
plt.plot(range(100),lr_list,color = 'r')

  • torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max, eta_min=0, last_epoch=-1)
參數(shù) 含義
T_max 對應(yīng)1/2個cos周期所對應(yīng)的epoch數(shù)值
eta_min 最小的lr值带族,默認為0
lr_list = []
model = net()
LR = 0.01
optimizer = Adam(model.parameters(),lr = LR)
scheduler = lr_scheduler.CosineAnnealingLR(optimizer, T_max = 20)
for epoch in range(100):
    scheduler.step()
    lr_list.append(optimizer.state_dict()['param_groups'][0]['lr'])
plt.plot(range(100),lr_list,color = 'r')

  • 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)

在發(fā)現(xiàn)loss不再降低或者acc不再提高之后锁荔,降低學習率。各參數(shù)意義如下:

參數(shù) 含義
mode 'min'模式檢測metric是否不再減小蝙砌,'max'模式檢測metric是否不再增大阳堕;
factor 觸發(fā)條件后lr*=factor跋理;
patience 不再減小(或增大)的累計次數(shù)恬总;
verbose 觸發(fā)條件后print前普;
threshold 只關(guān)注超過閾值的顯著變化;
threshold_mode 有rel和abs兩種閾值計算模式壹堰,rel規(guī)則:max模式下如果超過best(1+threshold)為顯著拭卿,min模式下如果低于best(1-threshold)為顯著;abs規(guī)則:max模式下如果超過best+threshold為顯著贱纠,min模式下如果低于best-threshold為顯著峻厚;
cooldown 觸發(fā)一次條件后,等待一定epoch再進行檢測谆焊,避免lr下降過速惠桃;
min_lr 最小的允許lr;
eps 如果新舊lr之間的差異小與1e-8懊渡,則忽略此次更新刽射。

如需了解其它學習率更新方法請訪問: https://www.emperinter.info/2020/08/01/learning-rate-in-pytorch/

示例

使用的更新方法

  • 代碼中可選的選項有:余弦方式(默認方式,其他兩種注釋了)剃执、e^-x的方式以及按loss是否不在降低來判斷的三種方式誓禁,其他就自己測試吧!

  • 訓(xùn)練截圖(第一個圖為trainingg_loss,第二個為學習率變化曲線)

完整代碼

import torch
import torchvision
import torchvision.transforms as transforms
import matplotlib.pyplot as plt
import numpy as np
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from datetime import datetime
from torch.utils.tensorboard import SummaryWriter
from torch.optim import *

transform = transforms.Compose(
    [transforms.ToTensor(),
     transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])

trainset = torchvision.datasets.CIFAR10(root='./data', train=True,
                                        download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=4,
                                          shuffle=True, num_workers=0)

testset = torchvision.datasets.CIFAR10(root='./data', train=False,
                                       download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=4,
                                         shuffle=False, num_workers=0)

classes = ('plane', 'car', 'bird', 'cat',
           'deer', 'dog', 'frog', 'horse', 'ship', 'truck')
#如需了解示例完整代碼及其后續(xù)內(nèi)容請訪問: [https://www.emperinter.info/2020/08/01/learning-rate-in-pytorch/](https://www.emperinter.info/2020/08/01/learning-rate-in-pytorch/)          

如需了解示例完整代碼及其后續(xù)內(nèi)容請訪問: https://www.emperinter.info/2020/08/01/learning-rate-in-pytorch/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末肾档,一起剝皮案震驚了整個濱河市摹恰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌怒见,老刑警劉巖俗慈,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異遣耍,居然都是意外死亡闺阱,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門舵变,熙熙樓的掌柜王于貴愁眉苦臉地迎上來酣溃,“玉大人,你說我怎么就攤上這事纪隙∩尥悖” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵绵咱,是天一觀的道長碘饼。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么艾恼? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任住涉,我火速辦了婚禮,結(jié)果婚禮上钠绍,老公的妹妹穿的比我還像新娘秆吵。我一直安慰自己,他們只是感情好五慈,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布纳寂。 她就那樣靜靜地躺著,像睡著了一般泻拦。 火紅的嫁衣襯著肌膚如雪毙芜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天争拐,我揣著相機與錄音腋粥,去河邊找鬼。 笑死架曹,一個胖子當著我的面吹牛隘冲,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播绑雄,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼展辞,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了万牺?” 一聲冷哼從身側(cè)響起罗珍,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎脚粟,沒想到半個月后覆旱,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡核无,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年扣唱,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片团南。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡噪沙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出已慢,到底是詐尸還是另有隱情曲聂,我是刑警寧澤霹购,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布佑惠,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏膜楷。R本人自食惡果不足惜旭咽,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赌厅。 院中可真熱鬧穷绵,春花似錦、人聲如沸特愿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽揍障。三九已至目养,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間毒嫡,已是汗流浹背癌蚁。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留兜畸,地道東北人努释。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像咬摇,于是被迫代替她去往敵國和親伐蒂。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容