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

對pytorch中的梯度更新方法詳解

 更新時間:2019年08月20日 11:34:15   作者:庫頁  
今天小編就為大家分享一篇對pytorch中的梯度更新方法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

背景

使用pytorch時,有一個yolov3的bug,我認為涉及到學(xué)習(xí)率的調(diào)整。收集到tencent yolov3和mxnet開源的yolov3,兩個優(yōu)化器中的學(xué)習(xí)率設(shè)置不一樣,而且使用GPU數(shù)目和batch的更新也不太一樣。據(jù)此,我簡單的了解了下pytorch的權(quán)重梯度的更新策略,看看能否一窺究竟。

對代碼說明

共三個實驗,分布寫在代碼中的(一)(二)(三)三個地方。運行實驗時注釋掉其他兩個

實驗及其結(jié)果

實驗(三):

不使用zero_grad()時,grad累加在一起,官網(wǎng)是使用accumulate 來表述的,所以不太清楚是取的和還是均值(這兩種最有可能)。

不使用zero_grad()時,是直接疊加add的方式累加的。

tensor([[[ 1., 1.],……torch.Size([2, 2, 2])
0 2 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
tensor([[[ 2., 2.],…… torch.Size([2, 2, 2])
1 2 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
tensor([[[ 3., 3.],…… torch.Size([2, 2, 2])
2 2 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 

實驗(二):

單卡上不同的batchsize對梯度是怎么作用的。 mini-batch SGD中的batch是加快訓(xùn)練,同時保持一定的噪聲。但設(shè)置不同的batchsize的權(quán)重的梯度是怎么計算的呢。

設(shè)置運行實驗(二),可以看到結(jié)果如下:所以單卡batchsize計算梯度是取均值的

tensor([[[ 3., 3.],…… torch.Size([2, 2, 2])

實驗(一):

多gpu情況下,梯度怎么合并在一起的。

在《training imagenet in 1 hours》中提到grad是allreduce的,是累加的形式。但是當設(shè)置g=2,實驗一運行時,結(jié)果也是取均值的,類同于實驗(二)

tensor([[[ 3., 3.],…… torch.Size([2, 2, 2])

實驗代碼

import torch
import torch.nn as nn
from torch.autograd import Variable


class model(nn.Module):
 def __init__(self, w):
  super(model, self).__init__()
  self.w = w

 def forward(self, xx):
  b, c, _, _ = xx.shape
  # extra = xx.device.index + 1 ## 實驗(一)
  y = xx.reshape(b, -1).mm(self.w.cuda(xx.device).reshape(-1, 2) * extra)
  return y.reshape(len(xx), -1)


g = 1
x = Variable(torch.ones(2, 1, 2, 2))
# x[1] += 1 ## 實驗(二)
w = Variable(torch.ones(2, 2, 2) * 2, requires_grad=True)
# optim = torch.optim.SGD({'params': x},
lr = 0.01
momentum = 0.9
M = model(w)

M = torch.nn.DataParallel(M, device_ids=range(g))

for i in range(3):
 b = len(x)
 z = M(x)
 zz = z.sum(1)
 l = (zz - Variable(torch.ones(b).cuda())).mean()
 # zz.backward(Variable(torch.ones(b).cuda()))
 l.backward()
 print(w.grad, w.grad.shape)
 # w.grad.zero_() ## 實驗(三)
 print(i, b, '* * ' * 20)

以上這篇對pytorch中的梯度更新方法詳解就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python爬蟲實例扒取2345天氣預(yù)報

    Python爬蟲實例扒取2345天氣預(yù)報

    本篇文章給大家詳細分析了通過Python爬蟲如何采集到2345的天氣預(yù)報信息,有興趣的朋友參考學(xué)習(xí)下吧。
    2018-03-03
  • python上下文管理器異常問題解決方法

    python上下文管理器異常問題解決方法

    在本篇文章里小編給大家整理的是一篇關(guān)于python上下文管理器異常問題解決方法,對此有興趣的朋友們可以學(xué)習(xí)參考下。
    2021-02-02
  • 音頻處理 windows10下python三方庫librosa安裝教程

    音頻處理 windows10下python三方庫librosa安裝教程

    這篇文章主要介紹了音頻處理 windows10下python三方庫librosa安裝方法,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • pycharm連接虛擬機的實現(xiàn)步驟

    pycharm連接虛擬機的實現(xiàn)步驟

    本文主要介紹了pycharm連接虛擬機的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-12-12
  • PyQt5每天必學(xué)之切換按鈕

    PyQt5每天必學(xué)之切換按鈕

    這篇文章主要為大家詳細介紹了PyQt5每天必學(xué)之切換按鈕的相關(guān)資料,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • python判斷變量是否為列表的方法

    python判斷變量是否為列表的方法

    在本篇文章里小編給大家整理了關(guān)于python判斷變量是否為列表的方法,有需要的朋友們可以學(xué)習(xí)下。
    2020-09-09
  • Python實現(xiàn)Harbor私有鏡像倉庫垃圾自動化清理詳情

    Python實現(xiàn)Harbor私有鏡像倉庫垃圾自動化清理詳情

    這篇文章主要介紹了Python實現(xiàn)Harbor私有鏡像倉庫垃圾自動化清理詳情,文章圍繞主題分享相關(guān)詳細代碼,需要的小伙伴可以參考一下
    2022-05-05
  • Python中Selenium庫使用教程詳解

    Python中Selenium庫使用教程詳解

    這篇文章主要介紹了Python中Selenium庫使用教程詳解,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • 詳解Python網(wǎng)絡(luò)爬蟲功能的基本寫法

    詳解Python網(wǎng)絡(luò)爬蟲功能的基本寫法

    這篇文章主要介紹了Python網(wǎng)絡(luò)爬蟲功能的基本寫法,網(wǎng)絡(luò)爬蟲,即Web Spider,是一個很形象的名字。把互聯(lián)網(wǎng)比喻成一個蜘蛛網(wǎng),那么Spider就是在網(wǎng)上爬來爬去的蜘蛛,對網(wǎng)絡(luò)爬蟲感興趣的朋友可以參考本文
    2016-01-01
  • python實現(xiàn)決策樹

    python實現(xiàn)決策樹

    這篇文章主要為大家詳細介紹了python實現(xiàn)決策樹的相關(guān)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12

最新評論