要理解Pytorch求解梯度,首先須要理解Pytorch當中的計算圖的概念,在計算圖當中每個Variable都表明的一個節點,每個節點就能夠表明一個神經元,咱們只有將變量放入節點當中才能夠對節點當中的變量求解梯度,假設咱們有一個矩陣:函數
1., 2., 3.
4., 5., 6.
咱們將這個矩陣(二維張量)首先在Pytorch當中初始化,而且將其放入計算圖當中的節點當中,在Pytorch當中,一個節點用Variable來表示,所以能夠編寫以下代碼:ui
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。spa
最後咱們寫出其餘變量有關x的表達式:code
y=2*x*x+2
j=y.mean()
這樣就獲得了j的值,這是一個標量,由於mean表示的求解平均值,在Pytorch當中只可以標量對標量,或者標量對張量求解偏導數,不然就會報錯。blog
如今咱們的計算圖模型就搭建完畢了,整個模型當中只有一個節點,其餘的表示至關於神經元當中的權重,以及J表明loss函數,咱們調用Pytorch當中的反向傳播函數backward(),對x關於j的梯度進行求解,代碼以下:class
j.backward()
這樣梯度就求解完畢了,咱們打印出x關於j的梯度的值,後面的參數x.grad表示求解出來的x的梯度大小:import
print("x的梯度是:",x.grad)
輸出:require
x的梯度是:
tensor([[0.6667, 1.3333, 2.0000], [2.6667, 3.3333, 4.0000]]
得解!變量