1. 程式人生 > >pytorch學習入門 (二) Variable(變數)

pytorch學習入門 (二) Variable(變數)

Variable(變數)

autograd.Variable 是包的核心類. 它包裝了張量, 並且支援幾乎所有的操作. 一旦你完成了你的計算, 你就可以呼叫 .backward() 方法, 然後所有的梯度計算會自動進行.

你還可以通過 .data 屬性來訪問原始的張量, 而關於該 variable(變數)的梯度會被累計到 .grad上去.

Variable

Variable

還有一個針對自動求導實現來說非常重要的類 - Function.

Variable 和 Function 是相互聯絡的, 並且它們構建了一個非迴圈的圖, 編碼了一個完整的計算曆史資訊. 每一個 variable(變數)都有一個 .grad_fn

 屬性, 它引用了一個已經建立了 Variable 的 Function (除了使用者建立的 Variable `` 之外 - 它們的 ``grad_fn is None ).

如果你想計算導數, 你可以在 Variable 上呼叫 .backward() 方法. 如果 Variable 是標量的形式(例如, 它包含一個元素資料), 你不必指定任何引數給 backward(), 但是, 如果它有更多的元素. 你需要去指定一個 grad_output 引數, 該引數是一個匹配 shape(形狀)的張量.

import torch
from torch.autograd import Variable

建立 variable(變數):

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

variable(變數)的操作:

y = x + 2
print(y)

y 由操作建立,所以它有 grad_fn 屬性.

print(y.grad_fn)

y 的更多操作

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

print(z, out)

梯度

我們現在開始瞭解反向傳播, out.backward() 與 out.backward(torch.Tensor([1.0])) 這樣的方式一樣

out.backward()

但因 d(out)/dx 的梯度

print(x.grad)

你應該得到一個 4.5 的矩陣. 讓我們推匯出 out Variable “oo”. 我們有 o=14∑izio=14∑izi, zi=3(xi+2)2zi=3(xi+2)2和 zi∣∣xi=1=27zi|xi=1=27. 因此, ∂o∂xi=32(xi+2)∂o∂xi=32(xi+2), 所以 ∂o∂xi∣∣xi=1=92=4.5∂o∂xi|xi=1=92=4.5.

你可以使用自動求導來做很多有趣的事情

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)