1. 程式人生 > >Pytorch入門——Autograd:自動分化

Pytorch入門——Autograd:自動分化

在上一篇部落格已經對Pytorch的Tensor進行了快速介紹,本章將繼續學習autograd包。autograd包是PyTorch所有神經網路的核心,為Tensors上的所有操作提供了自動區分。同時,它也是一個逐個執行的框架,意味著backprop由程式碼執行定義,每一次迭代都可以不同,下面進行一一介紹autograd包中的變數和梯度。

1.變數

autograd.Variable是包的中央類,包含一個張量,並支援幾乎所有定義的操作,在完成計算後,呼叫.backward()並自動計算所有梯度。可以通過.data屬性訪問原始張量,而將此變數的梯度累加到.grad;還有一個類對於autograd實現非常重要 - a Function


這裡寫圖片描述
VariableFunction互連並建立一個非迴圈圖,編碼完整的計算曆史。 每個變數都有一個.grad_fn屬性,它引用了一個已經建立了VariableFunction(除了使用者建立的變數代替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 可以參考官網文件