要理解Pytorch求解梯度,首先需要理解Pytorch當中的計算圖的概念,在計算圖當中每一個Variable都代表的一個節點,每一個節點就可以代表一個神經元,我們只有將變數放入節點當中才可以對節點當中的變數求解梯度,假設我們有一個矩陣:
1., 2., 3.
4., 5., 6.
我們將這個矩陣(二維張量)首先在Pytorch當中初始化,并且將其放入計算圖當中的節點當中,在Pytorch當中,一個節點用Variable來表示,因此可以撰寫如下代碼:
import torch from torch.autograd import Variable # 我們創建的是一個二維張量(即矩陣)而不是標量,因此會報錯 # 在Pytorch當中,僅允許標量對標量或者 標量對向量(或者張量)求解偏導數 x=Variable(torch.Tensor([[1., 2., 3.], [4., 5., 6.]]), requires_grad=True)
在節點當中,擁有requires_grad的引數,系統默認是False,也就是不能對其中的變數求解梯度,但是我們需要里面變數的梯度,因此需要將整個引數命名為True,
最后我們寫出其他變數有關x的運算式:
y=2*x*x+2
j=y.mean()
這樣就得到了j的值,這是一個標量,因為mean表示的求解平均值,在Pytorch當中只能夠標量對標量,或者標量對張量求解偏導數,否則就會報錯,
現在我們的計算圖模型就搭建完畢了,整個模型當中只有一個節點,其他的表示相當于神經元當中的權重,以及J代表loss函式,我們呼叫Pytorch當中的反向傳播函式backward(),對x關于j的梯度進行求解,代碼如下:
j.backward()
這樣梯度就求解完畢了,我們列印出x關于j的梯度的值,后面的引數x.grad表示求解出來的x的梯度大小:
print("x的梯度是:",x.grad)
輸出:
x的梯度是:
tensor([[0.6667, 1.3333, 2.0000], [2.6667, 3.3333, 4.0000]]
得解!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/36664.html
標籤:其他
