pytorch兩個基本對象:Tensor(張量)和Variable(變量)
其中,tensor不能反向傳播,variable可以反向傳播。
tensor的算術運算和選取操作與numpy一樣,一次你numpy相似的運算操作都可以遷移過來。
Variable
variable是一種可以不斷變化的變量,符合反向傳播,參數更新的屬性。pytorch的variable是一個存放會變化值的地理位置,里面的值會不停變化,像裝糖果(糖果就是數據,即tensor)的盒子,糖果的數量不斷變化。pytorch都是由tensor計算的,而tensor里面的參數是variable形式。
擴展
在PyTorch中計算圖的特點總結如下:
autograd根據用戶對Variable的操作來構建其計算圖。
1、requires_grad
variable默認是不需要被求導的,即requires_grad屬性默認為False,如果某一個節點的requires_grad為True,那么所有依賴它的節點requires_grad都為True。
2、volatile
variable的volatile屬性默認為False,如果某一個variable的volatile屬性被設為True,那么所有依賴它的節點volatile屬性都為True。volatile屬性為True的節點不會求導,volatile的優先級比requires_grad高。
3、retain_graph
多次反向傳播(多層監督)時,梯度是累加的。一般來說,單次反向傳播后,計算圖會free掉,也就是反向傳播的中間緩存會被清空【這就是動態度的特點】。為進行多次反向傳播需指定retain_graph=True來保存這些緩存。
4、backward(grad_variables=None,retain_graph=None,create_graph=None)
反向傳播,求解Variable的梯度。放在中間緩存中。
PyTorch 的 backward 為什么有一個 grad_variables 參數?
假設 x 經過一番計算得到 y,那么 y.backward(w) 求的不是 y 對 x 的導數,而是 l = torch.sum(y*w) 對 x 的導數。w 可以視為 y 的各分量的權重,也可以視為遙遠的損失函數 l 對 y 的偏導數。也就是說,不一定需要從計算圖最后的節點 y 往前反向傳播,從中間某個節點 n 開始傳也可以,只要你能把損失函數 l 關於這個節點的導數 dl/dn 記錄下來,n.backward(dl/dn) 照樣能往前回傳,正確地計算出損失函數 l 對於節點 n 之前的節點的導數。特別地,若 y 為標量,w 取默認值 1.0,才是按照我們通常理解的那樣,求 y 對 x 的導數。
5、grad_variable
grad_variables是y求導時的梯度參數,由於autograd僅用於標量,因此當y不是標量且在聲明時使用了requires_grad=True,必須指定grad_variables參數,在完成原始的反向傳播之后得到的梯度會對這個grad_variables進行修正,然后將結果保存在Variable的grad中。grad_variables形狀必須與Variable一致。在深度學習中求導與梯度有關,因此grad_variables一般會定義類似為[1, 0.1, 0.01, 0.001],表示梯度的方向,取較小的之不會對求導效率有影響。
>>>import torch >>>from torch.autograd import Variable >>> x=torch.rand(4) >>> x tensor([0.4635, 0.4753, 0.1375, 0.3797]) >>> x=variable(x,requires_grad=True) >>> y=x*3 >>> y tensor([1.3905, 1.4260, 0.4125, 1.1391], grad_fn=<MulBackward0>) >>> grad_variables = torch.FloatTensor([1,2,3,4]) #梯度參數grad_variables形狀必須與Variable一致 >>> grad_variables tensor([1., 2., 3., 4.]) >>> y.backward(grad_variables) >>> x.grad tensor([ 3., 6., 9., 12.])