Pytorch 學習率衰減 之 余弦退火與余弦warmup 自定義學習率衰減scheduler

學習率衰減,通常我們英文也叫做scheduler。本文學習率衰減自定義,通過2種方法實現自定義,一是利用lambda,另外一個是繼承pytorch的lr_scheduler

import math
import matplotlib.pyplot as plt
import numpy as np
import torch
import torch.nn as nn
from torch.optim import *
from torchvision import models
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)

余弦退火

  1. 當T_max=20
lrs = []
model = Net()
LR = 0.01
epochs = 100
optimizer = Adam(model.parameters(),lr = LR)
scheduler = lr_scheduler.CosineAnnealingLR(optimizer, T_max=20, eta_min=1e-9)
for epoch in range(epochs): optimizer.step()lrs.append(optimizer.state_dict()['param_groups'][0]['lr'])scheduler.step()plt.figure(figsize=(10, 6))   
plt.plot(lrs, color='r')
plt.text(0, lrs[0], str(lrs[0]))
plt.text(epochs, lrs[-1], str(lrs[-1]))
plt.show()

請添加圖片描述

  1. 當T_max = epochs,這就是我們經常用到的弦退火的 scheduler,下面再來看看帶Warm-up的
lrs = []
model = Net()
LR = 0.01
epochs = 100
optimizer = Adam(model.parameters(),lr = LR)
scheduler = lr_scheduler.CosineAnnealingLR(optimizer, T_max=epochs, eta_min=1e-9)
for epoch in range(epochs): optimizer.step()lrs.append(optimizer.state_dict()['param_groups'][0]['lr'])scheduler.step()plt.figure(figsize=(10, 6))   
plt.plot(lrs, color='r')
plt.text(0, lrs[0], str(lrs[0]))
plt.text(epochs, lrs[-1], str(lrs[-1]))
plt.show()

請添加圖片描述

WarmUp

下面來看看 Pytorch定義的余弦退貨的公式如下
ηt=ηmin+12(ηmax?ηmin)(1+cos?(TcurTmaxπ)),Tcur≠(2k+1)Tmax;ηt+1=ηt+12(ηmax?ηmin)(1?cos?(1Tmaxπ)),Tcur=(2k+1)Tmax.\begin{aligned} \eta_t & = \eta_{min} + \frac{1}{2}(\eta_{max} - \eta_{min})\left(1 + \cos\left(\frac{T_{cur}}{T_{max}}\pi\right)\right), & T_{cur} \neq (2k+1)T_{max}; \\ \eta_{t+1} & = \eta_{t} + \frac{1}{2}(\eta_{max} - \eta_{min}) \left(1 - \cos\left(\frac{1}{T_{max}}\pi\right)\right), & T_{cur} = (2k+1)T_{max}. \end{aligned}ηt?ηt+1??=ηmin?+21?(ηmax??ηmin?)(1+cos(Tmax?Tcur??π)),=ηt?+21?(ηmax??ηmin?)(1?cos(Tmax?1?π)),?Tcur??=(2k+1)Tmax?;Tcur?=(2k+1)Tmax?.?

實際上是用下面的公式做為更新的, 當Tcur=TmaxT_{cur} = T_{max}Tcur?=Tmax?是,coscoscos部分為0,所以就等于ηmin\eta_{min}ηmin?

ηt=ηmin+12(ηmax?ηmin)(1+cos?(TcurTmaxπ))\eta_t = \eta_{min} + \frac{1}{2}(\eta_{max} - \eta_{min})\left(1 + \cos\left(\frac{T_{cur}}{T_{max}}\pi\right)\right)ηt?=ηmin?+21?(ηmax??ηmin?)(1+cos(Tmax?Tcur??π))

這里直接根據公式的定義來畫個圖看看

etas = []
epochs = 100
eta_max = 1e-4
eta_min = 1e-9
t_max = epochs / 1
for i in range(epoch):t_cur = ieta = eta_min + 0.5 * (eta_max - eta_min) * (1 + np.cos(np.pi * t_cur / t_max))etas.append(eta)plt.figure(figsize=(10, 6))    
plt.plot(range(len(etas)), etas, color='r')
plt.text(epochs, lrs[-1], str(lrs[-1]))
plt.show()

請添加圖片描述
從圖上來看,跟上面的余弦退化是一樣的,眼尖的都會發現lr_min 不等于eta_min=1e-9

利用Lambda來定義的

有個較小的bug(也不算,在description里有指出)

def warm_up_cosine_lr_scheduler(optimizer, epochs=100, warm_up_epochs=5, eta_min=1e-9):"""Description:- Warm up cosin learning rate scheduler, first epoch lr is too smallArguments:- optimizer: input optimizer for the training- epochs: int, total epochs for your training, default is 100. NOTE: you should pass correct epochs for your training- warm_up_epochs: int, default is 5, which mean the lr will be warm up for 5 epochs. if warm_up_epochs=0, means no needto warn up, will be as cosine lr scheduler- eta_min: float, setup ConsinAnnealingLR eta_min while warm_up_epochs = 0Returns:- scheduler"""if warm_up_epochs <= 0:scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=epochs, eta_min=eta_min)else:warm_up_with_cosine_lr = lambda epoch: eta_min + (epoch / warm_up_epochs) if epoch <= warm_up_epochs else 0.5 * (np.cos((epoch - warm_up_epochs) / (epochs - warm_up_epochs) * np.pi) + 1)scheduler = torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda=warm_up_with_cosine_lr)return scheduler
# warm up consin lr scheduler
lrs = []
model = Net()
LR = 1e-4
warm_up_epochs = 30
epochs = 100
optimizer = SGD(model.parameters(), lr=LR)scheduler = warm_up_cosine_lr_scheduler(optimizer, warm_up_epochs=warm_up_epochs, eta_min=1e-9)for epoch in range(epochs):optimizer.step()lrs.append(optimizer.state_dict()['param_groups'][0]['lr'])scheduler.step()plt.figure(figsize=(10, 6))  ![請添加圖片描述](https://img-blog.csdnimg.cn/566b2c036b4a44598ae2a5a0548f2550.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAamFzbmVpaw==,size_20,color_FFFFFF,t_70,g_se,x_16)plt.plot(lrs, color='r')
plt.text(0, lrs[0], str(lrs[0]))
plt.text(epochs, lrs[-1], str(lrs[-1]))
plt.show()

請添加圖片描述
從圖上看,第一個lr非常非常小,導致訓練時的,第一個epoch基本上不更新

繼承lr_scheduler的類

class WarmupCosineLR(lr_scheduler._LRScheduler):def __init__(self, optimizer, lr_min, lr_max, warm_up=0, T_max=10, start_ratio=0.1):"""Description:- get warmup consine lr schedulerArguments:- optimizer: (torch.optim.*), torch optimizer- lr_min: (float), minimum learning rate- lr_max: (float), maximum learning rate- warm_up: (int),  warm_up epoch or iteration- T_max: (int), maximum epoch or iteration- start_ratio: (float), to control epoch 0 lr, if ratio=0, then epoch 0 lr is lr_minExample:<<< epochs = 100<<< warm_up = 5<<< cosine_lr = WarmupCosineLR(optimizer, 1e-9, 1e-3, warm_up, epochs)<<< lrs = []<<< for epoch in range(epochs):<<<     optimizer.step()<<<     lrs.append(optimizer.state_dict()['param_groups'][0]['lr'])<<<     cosine_lr.step()<<< plt.plot(lrs, color='r')<<< plt.show()"""self.lr_min = lr_minself.lr_max = lr_maxself.warm_up = warm_upself.T_max = T_maxself.start_ratio = start_ratioself.cur = 0    # current epoch or iterationsuper().__init__(optimizer, -1)def get_lr(self):if (self.warm_up == 0) & (self.cur == 0):lr = self.lr_maxelif (self.warm_up != 0) & (self.cur <= self.warm_up):if self.cur == 0:lr = self.lr_min + (self.lr_max - self.lr_min) * (self.cur + self.start_ratio) / self.warm_upelse:lr = self.lr_min + (self.lr_max - self.lr_min) * (self.cur) / self.warm_up# print(f'{self.cur} -> {lr}')else:            # this works finelr = self.lr_min + (self.lr_max - self.lr_min) * 0.5 *\(np.cos((self.cur - self.warm_up) / (self.T_max - self.warm_up) * np.pi) + 1)self.cur += 1return [lr for base_lr in self.base_lrs]
# class
epochs = 100
warm_up = 5
cosine_lr = WarmupCosineLR(optimizer, 1e-9, 1e-3, warm_up, epochs, 0.1)
lrs = []
for epoch in range(epochs):optimizer.step()lrs.append(optimizer.state_dict()['param_groups'][0]['lr'])cosine_lr.step()plt.figure(figsize=(10, 6))   
plt.plot(lrs, color='r')
plt.text(0, lrs[0], str(lrs[0]))
plt.text(epochs, lrs[-1], str(lrs[-1]))
plt.show()

請添加圖片描述
從圖上看出,第一個epoch的lr也不至于非常非常小了,達到了所需預期,當然,如果你說first epoch的lr,你也需要非常非常小(<1e-8),你也可以自己嘗試其它值。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/260505.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/260505.shtml
英文地址,請注明出處:http://en.pswp.cn/news/260505.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

c++ 字符串賦給另一個_7.2 C++字符串處理函數

點擊上方“C語言入門到精通”&#xff0c;選擇置頂第一時間關注程序猿身邊的故事作者閆小林白天搬磚&#xff0c;晚上做夢。我有故事&#xff0c;你有酒么&#xff1f;C字符串處理函數C語言和C提供了一些字符串函數&#xff0c;使得用戶能很方便地對字符串進行處理。這些是放在…

如何檢測遠程主機上的某個端口是否開啟

有時候我們要測試遠程主機上的某個端口是否開啟&#xff0c;無需使用太復雜的工作&#xff0c;windows下就自帶了工具&#xff0c;那就是telnet。怎么檢測呢&#xff0c;按下面的步驟&#xff1a; 1、安裝telnet。我的win7下就沒有telnet&#xff0c;在cmd下輸入telnet提示沒有…

Windows10 + WSL (Ubuntu) + Anaconda + vscode 手把手配置python運行環境(含虛擬環境)

配置WSL windows桌面下&#xff0c;按下面順序可以找到 "啟動或關閉windows功能” &#xff0c; 開始 -> 設置 -> 應用 -> 應用和功能 -> 可選功能 -> 相關設置下 更多Windows功能&#xff08;滾動鼠標到底部&#xff09;點擊后&#xff0c;會彈出 啟動或…

Inline函數使用注意事項

Inline函數使用注意事項 1.在一個文件中定義的inline函數不能再另一個文件中使用 2.inline函數應簡潔&#xff0c;只有少數幾個語句。 3.在inline函數中不能有循環&#xff0c;if&#xff0c;switch語句。 4.inline函數要在調用和聲明前定義&#xff01;&#xff01;&#xff0…

2019編譯ffepeg vs_如何在windows10下使用vs2017編譯最新版本的FFmpeg和ffplay

該文章描述了如何在windows10 64位系統下面編譯出FFmpeg的庫及其自帶的ffplay播放器&#xff0c;而且全部采用最新的版本&#xff0c;這樣我們可以在vs2017的ide下調試ffplay&#xff0c;能使我們更容易學習FFmpeg的架構以及音視頻播放器的原理。步驟&#xff1a;1.安裝vs2017在…

訓練集山準確率高測試集上準確率很低_推薦算法改版前的AB測試

編輯導語&#xff1a;所謂推薦算法就是利用用戶的一些行為&#xff0c;通過一些數學算法&#xff0c;推測出用戶可能喜歡的東西&#xff1b;如今很多軟件都有這樣的操作&#xff0c;對于此系統的設計也會進行測試&#xff1b;本文作者分享了關于推薦算法改版前的AB測試&#xf…

C#實現漸變顏色的Windows窗體控件

C#實現漸變顏色的Windows窗體控件! 1,定義一個BaseFormGradient,繼承于System.Windows.Forms.Form2,定義三個變量: privateColor _Color1 Color.Gainsboro; privateColor _Color2 Color.White; privatefloat_ColorAngle 0f;3,重載OnPaintBackground方法 protecte…

ios7開發學習筆記-包括c oc 和ios介紹

請查看我的新浪資料分享 http://iask.sina.com.cn/u/2430843520 轉載于:https://www.cnblogs.com/langtianya/p/3708298.html

Windows下 jupyter notebook 運行multiprocessing 報錯的問題與解決方法

文章目錄測試用的代碼錯誤解決方法測試用的代碼 下面每一個對應一個jupyter notebook的單元格 import time from multiprocessing import Process, Queuedef generator():c 0while True:time.sleep(1.0) # read somethingyield cc 1%%timeds generator() for i in range(3…

如何將javaweb項目部署到linux下

以下是對將javaweb項目部署到linux下的方法進行了詳細的分析介紹一般都在windows下開發的現在部署到linux下將項目達成war包(用eclipse項目右鍵>Export>選擇war file)將tomcat(用winSCP當然你也可以用secureCRT用securCRT需要建立sftp(即上傳文件的目錄)用put tomcat命令…

vc mysql_vc6.0連接mysql數據庫

一、MySQL的安裝Mysql的安裝去官網下載就可以。。。最新的是5.7版本。。二、VC6.0的設置(1)打開VC6.中選0 工具欄Tools菜單下的Options選項&#xff0c;在Directories的標簽頁中右邊的“Show directories for:”下拉列表中“Includefiles”&#xff0c;然后在中間列表框中添加你…

python class用法_python原類、類的創建過程與方法

【小宅按】今天為大家介紹一下python中與class 相關的知識……獲取對象的類名python是一門面向對象的語言&#xff0c;對于一切接對象的python來說&#xff0c;咱們有必要深入的學習與了解一些知識首先大家都知道&#xff0c;要獲取一個對象所對應的類&#xff0c;需要使用clas…

網易公開課

計算機科學及編程導論 http://v.163.com/special/opencourse/bianchengdaolun.html 抽象編程 http://v.163.com/special/opencourse/abstractions.html轉載于:https://www.cnblogs.com/anyboo/archive/2012/08/24/2653537.html

深度學習中的一些常見的激活函數集合(含公式與導數的推導)sigmoid, relu, leaky relu, elu, numpy實現

文章目錄Sigmoid(x)雙曲正切線性整流函數 rectified linear unit &#xff08;ReLu&#xff09;PReLU(Parametric Rectified Linear Unit) Leaky ReLu指數線性單元 Exponential Linear Units &#xff08;ELU&#xff09;感知機激活%matplotlib inline %config InlineBackend.f…

最牛X的GCC 內聯匯編

正如大家知道的&#xff0c;在C語言中插入匯編語言&#xff0c;其是Linux中使用的基本匯編程序語法。本文將講解 GCC 提供的內聯匯編特性的用途和用法。對于閱讀這篇文章&#xff0c;這里只有兩個前提要求&#xff0c;很明顯&#xff0c;就是 x86 匯編語言和 C 語言的基本認識。…

mysql的告警日志_MySQL Aborted connection告警日志的分析

前言&#xff1a;有時候&#xff0c;連接MySQL的會話經常會異常退出&#xff0c;錯誤日志里會看到"Got an error reading communication packets"類型的告警。本篇文章我們一起來討論下該錯誤可能的原因以及如何來規避。1.狀態變量Aborted_clients和Aborted_connects…

hosts多個ip對應一個主機名_一個簡單的Web應用程序,用作連接到ssh服務器的ssh客戶端...

WebSSH一個簡單的Web應用程序&#xff0c;用作連接到ssh服務器的ssh客戶端。它是用Python編寫的&#xff0c;基于tornado&#xff0c;paramiko和xterm.js。特征支持SSH密碼驗證&#xff0c;包括空密碼。支持SSH公鑰認證&#xff0c;包括DSA RSA ECDSA Ed25519密鑰。支持加密密鑰…

Yii框架中使用PHPExcel導出Excel文件

Yii框架中使用PHPExcel導出Excel文件http://www.cnblogs.com/wgx214/p/3709521.html轉載于:https://www.cnblogs.com/flying-tx/p/3714530.html

Shell Notes(1)

> vi復制粘貼 光標移動到要復制的部分的開頭&#xff0c;Esc退出插入模式&#xff0c;按v進入Visual模式&#xff0c;用hjkl選中要復制的部分 按Y或者yy&#xff0c;復制 移動光標到目標位置&#xff0c;按p&#xff0c;粘貼 > echo –e 參數 –e 可以使echo解釋由反斜杠…

mysql多表查詢語句_mysql查詢語句 和 多表關聯查詢 以及 子查詢

1.查詢一張表&#xff1a;select * from 表名&#xff1b;2.查詢指定字段&#xff1a;select 字段1&#xff0c;字段2&#xff0c;字段3….from 表名&#xff1b;3.where條件查詢&#xff1a;select字段1&#xff0c;字段2&#xff0c;字段3 frome表名 where 條件表達式&#x…