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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

pytorch 调参

發(fā)布時間:2023/12/14 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 pytorch 调参 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

關(guān)于優(yōu)化函數(shù)的調(diào)整

拆下包:https://ptorch.com/docs/1/optim

class torch.optim.Optimizer(params, defaults)

所有優(yōu)化的基類.

參數(shù):

  • params (iterable) —— 可迭代的Variable?或者?dict。指定應(yīng)優(yōu)化哪些變量。
  • defaults-(dict):包含優(yōu)化選項的默認值的dict(一個參數(shù)組沒有指定的參數(shù)選項將會使用默認值)。
  • load_state_dict(state_dict)

    加載optimizer狀態(tài)

    參數(shù):

  • state_dict (dict) ——?optimizer的狀態(tài)。應(yīng)該是state_dict()調(diào)用返回的對象。
  • state_dict()

    將優(yōu)化器的狀態(tài)返回為一個dict。

    它包含兩個內(nèi)容:

  • state - 持有當(dāng)前optimization狀態(tài)的dict。它包含了 優(yōu)化器類之間的不同。
  • param_groups - 一個包含了所有參數(shù)組的dict。
  • step(closure)

    執(zhí)行單個優(yōu)化步驟(參數(shù)更新)。

    不同的優(yōu)化算子

    參考:莫煩大神視頻,傳送門不給直接百度搜就好;

    首先給出基本的四種更換優(yōu)化算子的代碼:

    # SGD 就是隨機梯度下降 opt_SGD = torch.optim.SGD(net_SGD.parameters(), lr=LR)# momentum 動量加速,在SGD函數(shù)里指定momentum的值即可 opt_Momentum = torch.optim.SGD(net_Momentum.parameters(), lr=LR, momentum=0.8)# RMSprop 指定參數(shù)alpha opt_RMSprop = torch.optim.RMSprop(net_RMSprop.parameters(), lr=LR, alpha=0.9)# Adam 參數(shù)betas=(0.9, 0.99) opt_Adam = torch.optim.Adam(net_Adam.parameters(), lr=LR, betas=(0.9, 0.99)) #再看下官方文檔 class torch.optim.Adam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0)[source] 實現(xiàn)Adam算法。它在Adam: A Method for Stochastic Optimization中被提出。#參數(shù):params (iterable) – 用于優(yōu)化的可以迭代參數(shù)或定義參數(shù)組lr (float, 可選) – 學(xué)習(xí)率(默認:1e-3)betas (Tuple[float, float], 可選) – 用于計算梯度運行平均值及其平方的系數(shù)(默認:0.9, 0.999)eps (float, 可選) – 增加分母的數(shù)值以提高數(shù)值穩(wěn)定性(默認:1e-8)weight_decay (float, 可選) – 權(quán)重衰減(L2范數(shù))(默認: 0)step(closure) #執(zhí)行單個優(yōu)化步驟。#參數(shù):closure (callable,可選) – 重新評估模型并返回損失的閉包。

    注意:momentum是梯度下降法中一種常用的加速技術(shù)。對于一般的SGD,其表達式為,沿負梯度方向下降。而帶momentum項的SGD則寫生如下形式:

    ?


    其中即momentum系數(shù),通俗的理解上面式子就是,如果上一次的momentum(即)與這一次的負梯度方向是相同的,那這次下降的幅度就會加大,所以這樣做能夠達到加速收斂的過程。

    關(guān)于學(xué)習(xí)率的調(diào)整

    首先在一開始的時候我們可以給我們的神經(jīng)網(wǎng)絡(luò)附一個“經(jīng)驗性”的學(xué)習(xí)率:

    lr=1e-3? ? ? ? #SGD

    lr=1e-3? ? ? ? #Adam一般要求學(xué)習(xí)率比較小

    接著,假設(shè)對于不同層想給予不同的學(xué)習(xí)率怎么辦呢?

    參考:https://www.cnblogs.com/hellcat/p/8496727.html

    # # 直接對不同的網(wǎng)絡(luò)模塊制定不同學(xué)習(xí)率 classifiter的學(xué)習(xí)率設(shè)置為1e-2,所有的momentum=0.9 optimizer = optim.SGD([{'params': net.features.parameters()}, # 默認lr是1e-5{'params': net.classifiter.parameters(), 'lr': 1e-2}], lr=1e-5,momentum=0.9)##=======================以層為單位,為不同層指定不同的學(xué)習(xí)率# ## 提取指定層對象為classifiter模塊的第0個和第3個 special_layers = t.nn.ModuleList([net.classifiter[0], net.classifiter[3]]) # ## 獲取指定層參數(shù)id special_layers_params = list(map(id, special_layers.parameters())) print(special_layers_params) # ## 獲取非指定層的參數(shù)id base_params = filter(lambda p: id(p) not in special_layers_params, net.parameters()) optimizer = t.optim.SGD([{'params': base_params},{'params': special_layers.parameters(), 'lr': 0.01}], lr=0.001)

    當(dāng)你發(fā)現(xiàn)你的loss在訓(xùn)練過程中居然還上升了,那么一般來講,是你此時的學(xué)習(xí)率設(shè)置過大了。這時候我們需要動態(tài)調(diào)整我們的學(xué)習(xí)率:

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

    官方文檔中還給出用?

    torch.optim.lr_scheduler?基于循環(huán)的次數(shù)提供了一些方法來調(diào)節(jié)學(xué)習(xí)率.

    ?

    torch.optim.lr_scheduler.ReduceLROnPlateau?基于驗證測量結(jié)果來設(shè)置不同的學(xué)習(xí)率.

    參考:https://ptorch.com/docs/1/optim?

    其他調(diào)參的策略

    1.L2-正則化防止過擬合

    weight decay(權(quán)值衰減),其最終目的是防止過擬合。在機器學(xué)習(xí)或者模式識別中,會出現(xiàn)overfitting,而當(dāng)網(wǎng)絡(luò)逐漸overfitting時網(wǎng)絡(luò)權(quán)值逐漸變大,因此,為了避免出現(xiàn)overfitting,會給誤差函數(shù)添加一個懲罰項,常用的懲罰項是所有權(quán)重的平方乘以一個衰減常量之和。其用來懲罰大的權(quán)值。在損失函數(shù)中,weight decay是放在正則項(regularization)前面的一個系數(shù),正則項一般指示模型的復(fù)雜度,所以weight decay的作用是調(diào)節(jié)模型復(fù)雜度對損失函數(shù)的影響,若weight decay很大,則復(fù)雜的模型損失函數(shù)的值也就大。

    這個在定義優(yōu)化器的時候可以通過參數(shù) 【weight_decay,一般建議0.0005】來設(shè)置:

    opt_Adam = torch.optim.Adam(net_Adam.parameters(), lr=LR, betas=(0.9, 0.99), eps=1e-06, weight_decay=0.0005)

    2、batch normalization。batch normalization的是指在神經(jīng)網(wǎng)絡(luò)中激活函數(shù)的前面,將按照特征進行normalization,這樣做的好處有三點:

    • 提高梯度在網(wǎng)絡(luò)中的流動。Normalization能夠使特征全部縮放到[0,1],這樣在反向傳播時候的梯度都是在1左右,避免了梯度消失現(xiàn)象。
    • 提升學(xué)習(xí)速率。歸一化后的數(shù)據(jù)能夠快速的達到收斂。
    • 減少模型訓(xùn)練對初始化的依賴。
    • 減少參數(shù)選擇的依賴

    一些通常的解釋:https://blog.csdn.net/hjimce/article/details/50866313?

    3、加入dropout層:dropout一般設(shè)置為0.5

    4、集成方法

    ?

    ?

    最后,在訓(xùn)練過程中關(guān)于loss的一些說明:

    參考:https://blog.csdn.net/LIYUAN123ZHOUHUI/article/details/74453980
    1 train loss 不斷下降,test loss 不斷下降,說明網(wǎng)絡(luò)正在學(xué)習(xí)
    2 train loss 不斷下降,test loss 趨于不變,說明網(wǎng)絡(luò)過擬合
    3 train loss 趨于不變,test loss 趨于不變,說明學(xué)習(xí)遇到瓶頸,需要減小學(xué)習(xí)率或者批處理大小
    4 train loss 趨于不變,test loss 不斷下降,說明數(shù)據(jù)集100%有問題
    5 train loss 不斷上升,test loss 不斷上升(最終變?yōu)镹aN),可能是網(wǎng)絡(luò)結(jié)構(gòu)設(shè)計不當(dāng),訓(xùn)練超參數(shù)設(shè)置不當(dāng),程序bug等某個問題引起
    6 train loss 不斷上下跳動,可能引起的原因:學(xué)習(xí)率過大,或者批處理大小太小

    總結(jié)

    以上是生活随笔為你收集整理的pytorch 调参的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。