神經網路:pytorch中Variable和view參數解析

在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的大小自動分配列數。

發佈了276 篇原創文章 · 獲贊 163 · 訪問量 35萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章