在PyTorch中計算圖的特點總結如下:
autograd根據用戶對Variable的操作來構建其計算圖。
requires_grad
variable默認是不需要被求導的,即requires_grad屬性默認爲False,如果某一個節點的requires_grad爲True,那麼所有依賴它的節點requires_grad都爲True。
volatile
variable的volatile屬性默認爲False,如果某一個variable的volatile屬性被設爲True,那麼所有依賴它的節點volatile屬性都爲True。volatile屬性爲True的節點不會求導,volatile的優先級比requires_grad高。
retain_graph
多次反向傳播(多層監督)時,梯度是累加的。一般來說,單次反向傳播後,計算圖會free掉,也就是反向傳播的中間緩存會被清空【這就是動態度的特點】。爲進行多次反向傳播需指定retain_graph=True來保存這些緩存。
.backward()
反向傳播,求解Variable的梯度。放在中間緩存中。
在torch裏面,view函數相當於numpy的reshape,來看幾個例子:
a = torch.arange(1, 17) # a's shape is (16,)
a.view(4, 4) # output below
tensor([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12],
[13, 14, 15, 16]])
[torch.FloatTensor of size 4x4]
a.view(2, 2, 4) # output below
tensor([[[ 1, 2, 3, 4],
[ 5, 6, 7, 8]],
[[ 9, 10, 11, 12],
[13, 14, 15, 16]]])
[torch.FloatTensor of size 2x2x4]
在函數的參數中經常可以看到-1例如x.view(-1, 4)
這裏-1表示一個不確定的數,就是你如果不確定你想要reshape成幾行,但是你很肯定要reshape成4列,那不確定的地方就可以寫成-1
例如一個長度的16向量x,
x.view(-1, 4)等價於x.view(4, 4)
x.view(-1, 2)等價於x.view(8,2)
以此類推。
關於x.view(0)的理解
x = x.view(x.size(0), -1)
這句話一般出現在model類的forward函數中,具體位置一般都是在調用分類器之前。分類器是一個簡單的nn.Linear()結構,輸入輸出都是維度爲一的值,x = x.view(x.size(0), -1) 這句話的出現就是爲了將前面多維度的tensor展平成一維。具體解析如下:
1.在torch的網絡定義部分的forward(self,x)中有可能會出現下面這句話:
x = x.view(x.size(0),-1)
2.這句話的意思是將多維度的Tensor展平成一維,但是到底轉換的樣子是什麼樣的其實我們這樣看並不明白
代碼展示
1.我們先定義一個Tensor:
import torch
a = torch.arange(1,17)
2.輸出這個Tensor的內容和大小:
print(a)
print(a.size(0))
代碼變爲:
import torch
a = torch.arange(1,17)
print(a)
print(a.size(0))
結果爲:
將Tensor轉換爲1維
輸入代碼:
b = a.view(a.size(0),-1)
print(b)
代碼變爲:
import torch
a = torch.arange(1,17)
print(a)
print(a.size(0))
b = a.view(a.size(0),-1)
print(b)
結果爲:
其中這個-1指的是不知道多少列的情況下,根據原來Tensor內容和Tensor的大小自動分配列數。