Pytorch學(xué)習(xí)筆記(2) Autograd(自動求導(dǎo)) —— PyTorch的核心

本文是Pytorch快速入門第二部分,主要學(xué)習(xí)記錄扶檐,主要翻譯
Pytorch Autograd部分教程原文

autograd 包是PyTorch中神經(jīng)網(wǎng)絡(luò)的核心部分。
torch.autograd提供了類和函數(shù), 用來對任意標(biāo)量函數(shù)進行求導(dǎo)吧碾。要想使用自動求導(dǎo)烟阐,只需要對已有的代碼進行微小的改變。只需要將所有的tensor包含進Variable對象中即可拧晕。

一隙姿、Tensor(張量)

  • torch.Tensor是程序包的中心類.
  • 如果將其屬性設(shè)置 .requires_grad(默認(rèn)為Flase)為True,它將開始跟蹤對其的所有操作.
  • 一旦你完成張量計算之后就可以調(diào)用.backward()函數(shù),它會幫你把所有的梯度計算好.
  • 通過Variable的.data屬性可以獲取到張量.
  • 通過Variabe的.grad屬性可以獲取到梯度.

二、Variable類

  • autograd.Variable 封裝了Tensor厂捞,支持幾乎所有的tensor操作输玷。一般情況下队丝,將代碼中的Tensor換成Variable,幾乎能夠正常工作欲鹏。

Variable的結(jié)構(gòu):


variable結(jié)構(gòu)

Function類

  • 對autograd的實現(xiàn)很重要的類就是autograd.Function
  • Variable跟Function一起構(gòu)建無環(huán)圖,完成了前向傳播的計算
  • 通過Function函數(shù)計算得到的變量都有一個.grad_fn屬性
  • 用戶自定義變量(不是通過函數(shù)計算得到的)的.grad_fn值為空
  • 調(diào)用.backward()函數(shù)計算梯度:
      1.當(dāng)變量out是標(biāo)量的時候机久,out.backward()等效于out.backward(torch.tensor(1.))
      2.當(dāng)變量不是標(biāo)量的時候,需要指定一個跟該變量同樣大小的張量grad_output用來存放計算好的梯度.
      以上官方實例 包含簡單的證明。
  • 導(dǎo)入包
import torch
from torch.autograd import Variable
  • 創(chuàng)建一個張量并設(shè)置requires_grad=True赔嚎,默認(rèn)為False膘盖。
x = Variable(torch.ones(2, 2), requires_grad=True))
print(x)
# output
tensor([[1., 1.],
        [1., 1.]], requires_grad=True)
  • 張量運算
y = x + 2
print(y)
# output
tensor([[3., 3.],
        [3., 3.]], grad_fn=<AddBackward0>)
  • y是通過Funciton計算所得,包含grad_fn屬性
print (x.grad_fn)
print (y.grad_fn)

# output 
None
<AddBackward0 at 0x127e95c90>
  • 在y上進行操作
z = y * y * 3
out = z.mean()
print(z, out)

# output
tensor([[27., 27.],
        [27., 27.]], grad_fn=<MulBackward0>) tensor(27., grad_fn=<MeanBackward0>)
  • requires_grad_( True) 改變Variable的requires_grad的屬性尤误,等同于Variable.requires_grad=True , 默認(rèn)的是False侠畔,如果沒有指定的話。
a = torch.randn(2, 2)
a = ((a * 3) / (a - 1))
print(a.requires_grad)
a.requires_grad_(True)
print(a.requires_grad)
b = (a * a).sum()
print(b.grad_fn)

# output
False
True
<SumBackward0 object at 0x7ff50a1a5c18>

Gradients

現(xiàn)在開始進行 backprop损晤。因為out包含一個標(biāo)量践图,out. backwards()等價于out. backwards(電筒.張量(1.))。

out.backward()
  • 輸出 d(out)/dx
print(x.grad)

# output
tensor([[4.5000, 4.5000],
        [4.5000, 4.5000]])

我們獲得了2*2的值為4.5的矩陣沉馆,把 out 簡化為 "o"码党。 o=\frac{1}{4} \sum_{i} z_{i} , z_i={3}(x_i + 2)^2 同時 \left.z_{i}\right|_{x_{i}=1}=27, 因此 \frac{\partial o}{\partial x_{i}}=\frac{3}{2}\left(x_{i}+2\right),最終\left.\frac{\partial o}{\partial x_{i}}\right|_{x_{i}=1}=\frac{9}{2}=4.5.

  • 這里的out為標(biāo)量,所以直接調(diào)用backward()函數(shù)即可.
  • 一定要注意當(dāng)out為數(shù)組時,用先定義一樣大小的Tensor例如grad_output執(zhí)行.backgrad(grad_output)語句.

舉個??:

x = torch.randn(3, requires_grad=True)

y = x * 2
while y.data.norm() < 1000:
    y = y * 2

print(y)

#output
tensor([ 1210.7769,  -263.2759, -1356.7284], grad_fn=<MulBackward0>)

此時輸出y不是標(biāo)量斥黑,因此需要給一個和輸出相同維度的向量揖盘。

v = torch.tensor([0.1, 1.0, 0.0001], dtype=torch.float)
y.backward(v)

print(x.grad)

#output
tensor([1.0240e+02, 1.0240e+03, 1.0240e-01])

三、更多

Document about autograd.Function is at https://pytorch.org/docs/stable/autograd.html#function

四锌奴、參考

Pytorch 60分鐘教程

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末兽狭,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子鹿蜀,更是在濱河造成了極大的恐慌箕慧,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件茴恰,死亡現(xiàn)場離奇詭異颠焦,居然都是意外死亡,警方通過查閱死者的電腦和手機往枣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進店門伐庭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人分冈,你說我怎么就攤上這事圾另。” “怎么了雕沉?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵集乔,是天一觀的道長。 經(jīng)常有香客問我坡椒,道長扰路,這世上最難降的妖魔是什么尤溜? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮幼衰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘缀雳。我一直安慰自己渡嚣,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布肥印。 她就那樣靜靜地躺著识椰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪深碱。 梳的紋絲不亂的頭發(fā)上腹鹉,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天,我揣著相機與錄音敷硅,去河邊找鬼功咒。 笑死,一個胖子當(dāng)著我的面吹牛绞蹦,可吹牛的內(nèi)容都是我干的力奋。 我是一名探鬼主播,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼幽七,長吁一口氣:“原來是場噩夢啊……” “哼景殷!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起澡屡,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤猿挚,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后驶鹉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绩蜻,經(jīng)...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年室埋,在試婚紗的時候發(fā)現(xiàn)自己被綠了辜羊。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,912評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡词顾,死狀恐怖八秃,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情肉盹,我是刑警寧澤昔驱,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站上忍,受9級特大地震影響骤肛,放射性物質(zhì)發(fā)生泄漏纳本。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一腋颠、第九天 我趴在偏房一處隱蔽的房頂上張望繁成。 院中可真熱鬧,春花似錦淑玫、人聲如沸巾腕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽尊搬。三九已至,卻和暖如春土涝,著一層夾襖步出監(jiān)牢的瞬間佛寿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工但壮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留冀泻,地道東北人。 一個月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓蜡饵,卻偏偏與公主長得像腔长,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子验残,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,922評論 2 361

推薦閱讀更多精彩內(nèi)容