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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

PyTorch框架学习十四——学习率调整策略

發布時間:2024/7/23 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PyTorch框架学习十四——学习率调整策略 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

PyTorch框架學習十四——學習率調整策略

  • 一、_LRScheduler類
  • 二、六種常見的學習率調整策略
    • 1.StepLR
    • 2.MultiStepLR
    • 3.ExponentialLR
    • 4.CosineAnnealingLR
    • 5.ReduceLRonPlateau
    • 6.LambdaLR

在上次筆記優化器的內容中介紹了學習率的概念,但是在整個訓練過程中學習率并不是一直不變的,一般學習率是要先設置的大一些,然后在訓練過程中慢慢減小。這次筆記就簡單介紹一下PyTorch中學習率調整策略。

一、_LRScheduler類

是各種具體學習率調整策略方法函數所要繼承的基類。

主要屬性:

  • optimizer:關聯的優化器
  • last_epoch:記錄epoch數
  • base_lrs:記錄初始學習率

主要方法:

  • step():更新下一個epoch的學習率。
  • get_lr():虛函數,計算下一個epoch的學習率。

二、六種常見的學習率調整策略

1.StepLR

功能:等間隔調整學習率。

torch.optim.lr_scheduler.StepLR(optimizer, step_size, gamma=0.1, last_epoch=-1)

參數如下:

  • step_size:調整間隔數,學習率衰減的周期。
  • gamma:調整系數,默認為0.1。
  • 調整方式:lr = lr * gamma

    舉個栗子:

    # 導入模塊、設定超參數、給定權重數據 import torch import torch.optim as optim import numpy as np import matplotlib.pyplot as plt torch.manual_seed(1)LR = 0.1 iteration = 10 max_epoch = 200weights = torch.randn((1), requires_grad=True) target = torch.zeros((1))optimizer = optim.SGD([weights], lr=LR, momentum=0.9)# StepLR,每隔50輪下降一次學習率 scheduler_lr = optim.lr_scheduler.StepLR(optimizer, step_size=50, gamma=0.1) # 設置學習率下降策略lr_list, epoch_list = list(), list() for epoch in range(max_epoch):# 獲取當前lr,新版本用 get_last_lr()函數,舊版本用get_lr()函數,具體看UserWarninglr_list.append(scheduler_lr.get_last_lr())epoch_list.append(epoch)for i in range(iteration):loss = torch.pow((weights - target), 2)loss.backward()optimizer.step()optimizer.zero_grad()scheduler_lr.step()plt.plot(epoch_list, lr_list, label="Step LR Scheduler") plt.xlabel("Epoch") plt.ylabel("Learning rate") plt.legend() plt.show()

    繪制出的結果如圖所示:

    從圖中可見每隔50輪學習率下降為原來的0.1倍。

    2.MultiStepLR

    功能:按照給定間隔調整學習率。

    torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones, gamma=0.1, last_epoch=-1)

    參數如下:

  • milestones:(列表)設定調整時刻數,必須是遞增的。
  • gamma:調整系數。
  • 調整方式:lr = lr * gamma

    舉個栗子:

    milestones = [50, 125, 160] scheduler_lr = optim.lr_scheduler.MultiStepLR(optimizer, milestones=milestones, gamma=0.1)lr_list, epoch_list = list(), list() for epoch in range(max_epoch):lr_list.append(scheduler_lr.get_last_lr())epoch_list.append(epoch)for i in range(iteration):loss = torch.pow((weights - target), 2)loss.backward()optimizer.step()optimizer.zero_grad()scheduler_lr.step()plt.plot(epoch_list, lr_list, label="Multi Step LR Scheduler\nmilestones:{}".format(milestones)) plt.xlabel("Epoch") plt.ylabel("Learning rate") plt.legend() plt.show()

    結果如下圖所示:

    從圖中可見,在我們設定的位置:50/125/160輪時學習率下降為原來的0.1倍。

    3.ExponentialLR

    功能:按指數衰減調整lr。

    torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma, last_epoch=-1)

    參數需要關注的只有一個:

    • gamma:指數的底。

    調整策略:lr = lr * gamma ^ epoch

    舉個栗子:

    gamma = 0.95 scheduler_lr = optim.lr_scheduler.ExponentialLR(optimizer, gamma=gamma)lr_list, epoch_list = list(), list() for epoch in range(max_epoch):lr_list.append(scheduler_lr.get_last_lr())epoch_list.append(epoch)for i in range(iteration):loss = torch.pow((weights - target), 2)loss.backward()optimizer.step()optimizer.zero_grad()scheduler_lr.step()plt.plot(epoch_list, lr_list, label="Exponential LR Scheduler\ngamma:{}".format(gamma)) plt.xlabel("Epoch") plt.ylabel("Learning rate") plt.legend() plt.show()

    學習率變化結果如下圖所示:

    4.CosineAnnealingLR

    功能:余弦周期調整lr。

    torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max, eta_min=0, last_epoch=-1)

    參數如下所示:

  • T_max:下降周期,注意不是cos的周期,是cos周期的一半。
  • eta_min:學習率下限,默認為0。
  • 調整方式:

    t_max = 50 scheduler_lr = optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=t_max, eta_min=0.)lr_list, epoch_list = list(), list() for epoch in range(max_epoch):lr_list.append(scheduler_lr.get_last_lr())epoch_list.append(epoch)for i in range(iteration):loss = torch.pow((weights - target), 2)loss.backward()optimizer.step()optimizer.zero_grad()scheduler_lr.step()plt.plot(epoch_list, lr_list, label="CosineAnnealingLR Scheduler\nT_max:{}".format(t_max)) plt.xlabel("Epoch") plt.ylabel("Learning rate") plt.legend() plt.show()

    學習率變化曲線如下圖所示:

    T_max設置為50,所以0-50下降,50-100上升,以此類推。

    5.ReduceLRonPlateau

    功能:監控指標,當指標不再變化則調整。

    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)

    參數如下所示:

  • mode:min/max兩種模式。
  • factor:調整系數。
  • patience:“耐心”,接收幾次不變化。
  • cooldown:“冷卻時間”,停止監控一段時間。
  • verbose:是否打印日志。
  • min_lr:學習率下限。
  • eps:學習率衰減最小值。
  • 舉個栗子:

    loss_value = 0.5 accuray = 0.9factor = 0.1 mode = "min" patience = 10 cooldown = 10 min_lr = 1e-4 verbose = Truescheduler_lr = optim.lr_scheduler.ReduceLROnPlateau(optimizer, factor=factor, mode=mode, patience=patience,cooldown=cooldown, min_lr=min_lr, verbose=verbose)for epoch in range(max_epoch):for i in range(iteration):# train(...)optimizer.step()optimizer.zero_grad()# if epoch == 5:# loss_value = 0.4scheduler_lr.step(loss_value)

    結果如下所示:

    Epoch 12: reducing learning rate of group 0 to 1.0000e-02. Epoch 33: reducing learning rate of group 0 to 1.0000e-03. Epoch 54: reducing learning rate of group 0 to 1.0000e-04.

    6.LambdaLR

    功能:自定義調整策略。

    torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda, last_epoch=-1)

    參數主要就一個:
    lr_lambda:函數或list。

    舉個例子:

    lr_init = 0.1weights_1 = torch.randn((6, 3, 5, 5)) weights_2 = torch.ones((5, 5))optimizer = optim.SGD([{'params': [weights_1]},{'params': [weights_2]}], lr=lr_init)lambda1 = lambda epoch: 0.1 ** (epoch // 20) lambda2 = lambda epoch: 0.95 ** epochscheduler = torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda=[lambda1, lambda2])lr_list, epoch_list = list(), list() for epoch in range(max_epoch):for i in range(iteration):# train(...)optimizer.step()optimizer.zero_grad()scheduler.step()lr_list.append(scheduler.get_lr())epoch_list.append(epoch)print('epoch:{:5d}, lr:{}'.format(epoch, scheduler.get_lr()))plt.plot(epoch_list, [i[0] for i in lr_list], label="lambda 1") plt.plot(epoch_list, [i[1] for i in lr_list], label="lambda 2") plt.xlabel("Epoch") plt.ylabel("Learning Rate") plt.title("LambdaLR") plt.legend() plt.show()

    結果如下圖所示,一個是每隔20輪學習率下降為0.1倍,一個是指數衰減,底為0.95:

    創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

    總結

    以上是生活随笔為你收集整理的PyTorch框架学习十四——学习率调整策略的全部內容,希望文章能夠幫你解決所遇到的問題。

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