基於PyTorch的深度學習入門教程(三)——自動梯度

前言

本文參考PyTorch官網的教程,分爲五個基本模塊來介紹PyTorch。爲了避免文章過長,這五個模塊分別在五篇博文中介紹。

Part1:PyTorch簡單知識

Part2:PyTorch的自動梯度計算

Part3:使用PyTorch構建一個神經網絡

Part4:訓練一個神經網絡分類器

Part5:數據並行化


本文是關於Part2的內容。

 

Part2:PyTorch的自動梯度計算

 

autograd package是PyTorch中所有神經網絡的核心。先了解一些基本知識,然後開始訓練第一個神經網絡。autograd package提供了Tensors上所有運算的自動求導功能。它是一個按運行定義(define-by-run)的框架,這意味着反向傳播是依據代碼運行情況而定義的,並且每一個單次迭代都可能不相同。

 

1 變量(Variable)

autograd.Variable 是這個package的中心類。它打包了一個Tensor,並且支持幾乎所有運算。一旦你完成了你的計算,可以調用.backward(),所有梯度就可以自動計算。

你可以使用.data屬性來訪問原始tensor。相對於變量的梯度值可以被積累到.grad中。

 

這裏還有一個類對於自動梯度的執行是很重要的:Function(函數)

變量和函數是相互關聯的,並且建立一個非循環圖。每一個變量有一個.grad_fn屬性,它可以引用一個創建了變量的函數(除了那些用戶創建的變量——他們的grad_fn是空的)。

如果想要計算導數,可以調用Variable上的.backward()。如果變量是標量(只有一個元素),你不需要爲backward()確定任何參數。但是,如果它有多個元素,你需要確定grad_output參數(這是一個具有匹配形狀的tensor)。

 

import torch
from torch.autograd import Variable

 

創建一個變量:

x = Variable(torch.ones(2, 2), requires_grad=True)
print(x)

 

對變量做一個運算:

y = x + 2
print(y)

 

y作爲一個運算的結果被創建,所以它有grad_fn。

print(y.grad_fn)

 

在y上做更多的運算:

z = y * y * 3
out = z.mean()

print(z, out)

 

2 梯度(Gradients)

現在來做反向傳播。out.backward()等價於out.backward(torch.Tensor([1.0]))。

out.backward()

打印梯度 d(out)/dx

print(x.grad)

 

你應該會得到一個元素爲4.5的矩陣。

 

你可以使用autograd做很多瘋狂的事情。

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

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

print(y)

gradients = torch.FloatTensor([0.1, 1.0, 0.0001])
y.backward(gradients)

print(x.grad)

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章