Pytorch入門——Autograd:自動分化
阿新 • • 發佈:2019-02-17
在上一篇部落格已經對Pytorch的Tensor進行了快速介紹,本章將繼續學習autograd包。autograd包是PyTorch所有神經網路的核心,為Tensors上的所有操作提供了自動區分。同時,它也是一個逐個執行的框架,意味著backprop由程式碼執行定義,每一次迭代都可以不同,下面進行一一介紹autograd包中的變數和梯度。
1.變數
autograd.Variable
是包的中央類,包含一個張量,並支援幾乎所有定義的操作,在完成計算後,呼叫.backward()
並自動計算所有梯度。可以通過.data
屬性訪問原始張量,而將此變數的梯度累加到.grad
;還有一個類對於autograd實現非常重要 - a Function
Variable
與Function
互連並建立一個非迴圈圖,編碼完整的計算曆史。 每個變數都有一個.grad_fn
屬性,它引用了一個已經建立了Variable
的Function
(除了使用者建立的變數代替creator is None
)。
如果要計算導數,可以在變數上呼叫.backward()
。 如果Variable
是一個標量(即它包含一個元素資料),則不需要為backward()
指定任何引數,但是如果它有更多元素,則需要指定一個grad_output
引數,該引數是匹配形狀的張量。
匯入autograd包及Variable
import torch
from torch.autograd import Variable
建立一個變數
x = Variable(torch.ones(2, 2), requires_grad=True)
print(x)
#輸出:
Variable containing:
1 1
1 1
[torch.FloatTensor of size 2x2]
對變數x做運算操作,如加法操作
y = x + 2
print(y)
#輸出:
Variable containing:
3 3
3 3
[torch.FloatTensor of size 2x2]
y由於加法操作造成的,所以擁有一個creator
print(y.creator )
#輸出:
<torch.autograd._functions.basic_ops.AddConstant object at 0x7fc150635138>
對y進行更多的操作
z = y * y * 3
out = z.mean()
print(z, out)
#輸出:
(Variable containing:
27 27
27 27
[torch.FloatTensor of size 2x2]
, Variable containing:
27
[torch.FloatTensor of size 1]
)
2.梯度
backprop out.backward()
相當於做了out.backward(torch.Tensor([1.0]))
out.backward()
print(x.grad)
#輸出:
Variable containing:
4.5000 4.5000
4.5000 4.5000
[torch.FloatTensor of size 2x2]
梯度求解過程可以具體參考官網文件。
可以用autograd
做更多運算
x = torch.randn(3)
x = Variable(x, requires_grad=True)
y = x * 2
while y.data.norm() < 1000:
y = y * 2
print(y)
#輸出:
Variable containing:
230.3768
323.7678
1557.6053
[torch.FloatTensor of size 3]
gradients = torch.FloatTensor([0.1, 1.0, 0.0001])
y.backward(gradients)
print(x.grad)
#輸出:
Variable containing:
102.4000
1024.0000
0.1024
[torch.FloatTensor of size 3]
Variable 和 Function 可以參考官網文件