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 * 2print(y)
gradients = torch.FloatTensor([0.1, 1.0, 0.0001]) y.backward(gradients)print(x.grad)