pytorch學習入門 (二) Variable(變數)
Variable(變數)
autograd.Variable
是包的核心類. 它包裝了張量, 並且支援幾乎所有的操作. 一旦你完成了你的計算, 你就可以呼叫 .backward()
方法, 然後所有的梯度計算會自動進行.
你還可以通過 .data
屬性來訪問原始的張量, 而關於該 variable(變數)的梯度會被累計到 .grad
上去.
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)