欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

關(guān)于torch.optim的靈活使用詳解(包括重寫SGD,加上L1正則)

 更新時(shí)間:2020年02月20日 13:51:39   作者:tsq292978891  
今天小編就為大家分享一篇關(guān)于torch.optim的靈活使用詳解(包括重寫SGD,加上L1正則),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧

torch.optim的靈活使用詳解

1. 基本用法:

要構(gòu)建一個(gè)優(yōu)化器Optimizer,必須給它一個(gè)包含參數(shù)的迭代器來優(yōu)化,然后,我們可以指定特定的優(yōu)化選項(xiàng),

例如學(xué)習(xí)速率,重量衰減值等。

注:如果要把model放在GPU中,需要在構(gòu)建一個(gè)Optimizer之前就執(zhí)行model.cuda(),確保優(yōu)化器里面的參數(shù)也是在GPU中。

例子:

optimizer = optim.SGD(model.parameters(), lr = 0.01, momentum=0.9)

2. 靈活的設(shè)置各層的學(xué)習(xí)率

將model中需要進(jìn)行BP的層的參數(shù)送到torch.optim中,這些層不一定是連續(xù)的。

這個(gè)時(shí)候,Optimizer的參數(shù)不是一個(gè)可迭代的變量,而是一個(gè)可迭代的字典

(字典的key必須包含'params'(查看源碼可以得知optimizer通過'params'訪問parameters),

其他的key就是optimizer可以接受的,比如說'lr','weight_decay'),可以將這些字典構(gòu)成一個(gè)list,

這樣就是一個(gè)可迭代的字典了。

注:這個(gè)時(shí)候,可以在optimizer設(shè)置選項(xiàng)作為關(guān)鍵字參數(shù)傳遞,這時(shí)它們將被認(rèn)為是默認(rèn)值(當(dāng)字典里面沒有這個(gè)關(guān)鍵字參數(shù)key-value對時(shí),就使用這個(gè)默認(rèn)的參數(shù))

This is useful when you only want to vary a single option, while keeping all others consistent between parameter groups.

例子:

optimizer = SGD([
        {'params': model.features12.parameters(), 'lr': 1e-2},
        {'params': model.features22.parameters()},
        {'params': model.features32.parameters()},
        {'params': model.features42.parameters()},
        {'params': model.features52.parameters()},
      ], weight_decay1=5e-4, lr=1e-1, momentum=0.9)

上面創(chuàng)建的optim.SGD類型的Optimizer,lr默認(rèn)值為1e-1,momentum默認(rèn)值為0.9。features12的參數(shù)學(xué)習(xí)率為1e-2。

靈活更改各層的學(xué)習(xí)率

torch.optim.optimizer.Optimizer的初始化函數(shù)如下:

__init__(self, params, lr=<object object>, momentum=0, dampening=0, weight_decay=0, nesterov=False)

params (iterable): iterable of parameters to optimize or dicts defining parameter groups (params可以是可迭代的參數(shù),或者一個(gè)定義參數(shù)組的字典,如上所示,字典的鍵值包括:params,lr,momentum,dampening,weight_decay,nesterov)

想要改變各層的學(xué)習(xí)率,可以訪問optimizer的param_groups屬性。type(optimizer.param_groups) -> list

optimizer.param_groups[0].keys()
Out[21]: ['dampening', 'nesterov', 'params', 'lr', 'weight_decay', 'momentum']

因此,想要更改某層參數(shù)的學(xué)習(xí)率,可以訪問optimizer.param_groups,指定某個(gè)索引更改'lr'參數(shù)就可以。

def adjust_learning_rate(optimizer, decay_rate=0.9):
  for para in optimizer.param_groups:
    para['lr'] = para['lr']*decay_rate

重寫torch.optim,加上L1正則

查看torch.optim.SGD等Optimizer的源碼,發(fā)現(xiàn)沒有L1正則的選項(xiàng),而L1正則更容易得到稀疏解。

這個(gè)時(shí)候,可以更改/home/smiles/anaconda2/lib/python2.7/site-packages/torch/optim/sgd.py文件,模擬L2正則化的操作。

L1正則化求導(dǎo)如下:

dw = 1 * sign(w)

更改后的sgd.py如下:

import torch
from torch.optim.optimizer import Optimizer, required

class SGD(Optimizer):
  def __init__(self, params, lr=required, momentum=0, dampening=0,
         weight_decay1=0, weight_decay2=0, nesterov=False):
    defaults = dict(lr=lr, momentum=momentum, dampening=dampening,
            weight_decay1=weight_decay1, weight_decay2=weight_decay2, nesterov=nesterov)
    if nesterov and (momentum <= 0 or dampening != 0):
      raise ValueError("Nesterov momentum requires a momentum and zero dampening")
    super(SGD, self).__init__(params, defaults)

  def __setstate__(self, state):
    super(SGD, self).__setstate__(state)
    for group in self.param_groups:
      group.setdefault('nesterov', False)

  def step(self, closure=None):
    """Performs a single optimization step.

    Arguments:
      closure (callable, optional): A closure that reevaluates the model
        and returns the loss.
    """
    loss = None
    if closure is not None:
      loss = closure()

    for group in self.param_groups:
      weight_decay1 = group['weight_decay1']
      weight_decay2 = group['weight_decay2']
      momentum = group['momentum']
      dampening = group['dampening']
      nesterov = group['nesterov']

      for p in group['params']:
        if p.grad is None:
          continue
        d_p = p.grad.data
        if weight_decay1 != 0:
          d_p.add_(weight_decay1, torch.sign(p.data))
        if weight_decay2 != 0:
          d_p.add_(weight_decay2, p.data)
        if momentum != 0:
          param_state = self.state[p]
          if 'momentum_buffer' not in param_state:
            buf = param_state['momentum_buffer'] = torch.zeros_like(p.data)
            buf.mul_(momentum).add_(d_p)
          else:
            buf = param_state['momentum_buffer']
            buf.mul_(momentum).add_(1 - dampening, d_p)
          if nesterov:
            d_p = d_p.add(momentum, buf)
          else:
            d_p = buf

        p.data.add_(-group['lr'], d_p)

    return loss

一個(gè)使用的例子:

optimizer = SGD([
        {'params': model.features12.parameters()},
        {'params': model.features22.parameters()},
        {'params': model.features32.parameters()},
        {'params': model.features42.parameters()},
        {'params': model.features52.parameters()},
      ], weight_decay1=5e-4, lr=1e-1, momentum=0.9)

以上這篇關(guān)于torch.optim的靈活使用詳解(包括重寫SGD,加上L1正則)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 從零學(xué)Python之入門(三)序列

    從零學(xué)Python之入門(三)序列

    今天比較清閑,多寫幾篇入門篇,本文是入門系列的第三篇,我們來學(xué)習(xí)下Python中的序列。
    2014-05-05
  • Python?Flask?實(shí)現(xiàn)?HTML?文件壓縮案例代碼(9?級壓縮)

    Python?Flask?實(shí)現(xiàn)?HTML?文件壓縮案例代碼(9?級壓縮)

    這篇文章主要介紹了Python?Flask?實(shí)現(xiàn)?HTML?文件壓縮案例代碼(9?級壓縮),本案例是基于?Python?Flask?進(jìn)行搭建,所以需要提前搭建一個(gè)?Flask?項(xiàng)目環(huán)境,有?app.py?文件和?templates/index.html?文件即可,需要的朋友可以參考下
    2023-01-01
  • Python如何實(shí)現(xiàn)在字符串里嵌入雙引號或者單引號

    Python如何實(shí)現(xiàn)在字符串里嵌入雙引號或者單引號

    今天小編就為大家分享一篇Python如何實(shí)現(xiàn)在字符串里嵌入雙引號或者單引號,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • 利用Python實(shí)現(xiàn)自動掃雷小腳本

    利用Python實(shí)現(xiàn)自動掃雷小腳本

    這篇文章主要介紹了利用Python實(shí)現(xiàn)自動掃雷小腳本,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • 詳解Python 3.10 中的新功能和變化

    詳解Python 3.10 中的新功能和變化

    這篇文章主要介紹了詳解Python 3.10 中的新功能和變化,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-04-04
  • 手機(jī)Python編程軟件QPython支持第三方庫安裝詳解

    手機(jī)Python編程軟件QPython支持第三方庫安裝詳解

    這篇文章主要為大家介紹了手機(jī)Python編程軟件QPython的推薦使用,支持第三方庫安裝,這樣大家在上下班途中也可以來練練手啦,有需要的朋友一起用起來吧
    2021-10-10
  • Python opencv圖像基本操作學(xué)習(xí)之灰度圖轉(zhuǎn)換

    Python opencv圖像基本操作學(xué)習(xí)之灰度圖轉(zhuǎn)換

    使用opencv將圖片轉(zhuǎn)為灰度圖主要有兩種方法,第一種是將彩色圖轉(zhuǎn)為灰度圖,第二種是在使用OpenCV讀取圖片的時(shí)候直接讀取為灰度圖,今天通過實(shí)例代碼講解Python opencv圖像基本操作學(xué)習(xí)之灰度圖轉(zhuǎn)換,感興趣的朋友一起看看吧
    2023-02-02
  • Django開發(fā)中復(fù)選框用法示例

    Django開發(fā)中復(fù)選框用法示例

    這篇文章主要介紹了Django開發(fā)中復(fù)選框用法,結(jié)合實(shí)例形式分析了Django基于ajax的復(fù)選框遍歷、提交及后臺數(shù)據(jù)庫查詢等相關(guān)操作技巧,需要的朋友可以參考下
    2018-03-03
  • Python中的字典遍歷備忘

    Python中的字典遍歷備忘

    這篇文章主要介紹了Python中的字典遍歷備忘,本文列舉了多種字典遍歷方法,適合初學(xué)者查看,并簡單講解了interitems和iterms區(qū)別,需要的朋友可以參考下
    2015-01-01
  • 使用Python制作讀單詞視頻的實(shí)現(xiàn)代碼

    使用Python制作讀單詞視頻的實(shí)現(xiàn)代碼

    我們經(jīng)常在B站或其他視頻網(wǎng)站上看到那種逐條讀單詞的視頻,但他們的視頻多多少少和我們的預(yù)期都不太一致,然而,網(wǎng)上很難找到和自己需求符合的視頻,所以本文給大家介紹了使用Python制作讀單詞視頻的實(shí)現(xiàn),需要的朋友可以參考下
    2024-04-04

最新評論