1. 程式人生 > 其它 >【Pytorch】:x.view() view()方法的使用

【Pytorch】:x.view() view()方法的使用

在pytorch當中,我們經常會用到x.view()方法來進行資料維度的變化,但是這個方法具體該如何使用呢?

下面我來記錄一下筆記:

一.按照傳入數字使資料維度進行轉換

首先,我們可以傳入我們想要的維度,然後按照傳入的數字對資料進行維度變化。比如,x.view()當中可以放入列表或者是單個數字,比如我們有程式碼先生成一個3*2維度的tensor矩陣,那麼我們的程式碼可以寫成x.view(3,2) 也可以在view方法當中放入列表[3,2],最終為x.view([3,2])如下所示:

import torch
b=torch.randn(3,2)#也可以寫成b=torch.randn([3,2]),效果是一樣的
print(b)

輸出如下:

tensor([[-0.0035, -0.7276],
        [ 2.5166, -0.0649],
        [ 2.3062, -1.1144]])

那麼我們想要將其維度進行隨意變化的話,可以使用view()方法,比如我想將其維度變化成:1*6,則使用方法view(1*6)即可。

程式碼如下:

import torch
b=torch.randn(3,2)
print(b)
print(b.view(1,6))
print(b.view(6,1))

輸出如下:

tensor([[-0.0035, -0.7276],
        [ 2.5166, -0.0649],
        [ 
2.3062, -1.1144]]) tensor([[-0.0035, -0.7276, 2.5166, -0.0649, 2.3062, -1.1144]]) tensor([[-0.0035], [-0.7276], [ 2.5166], [-0.0649], [ 2.3062], [-1.1144]])

這樣我們就可以看到tensor的維度確實根據我們所寫進行變化了。

二.傳入數字-1,自動對維度進行變換

這裡討論第二種方法,也就是在某一個維度,我們可以傳入數字-1,自動對維度進行計算並變化:

假設我們有一個數據維度為【3,5,2】的tensor,我們想要將其轉化為其中兩個維度分別為【3,1】,【5,2】,而剩下的第三個維度自動進行計算,那麼我們可以使用-1來代替【3,1,10】當中的10,以及用-1來代替轉化後【5,2,3】維度當中的數字3.我們可以發現3*1*10=3*5*2=5*2*3,因此變化後的維度乘積是相等的。

程式碼如下:

import torch
a=torch.randn(3,5,2)
print(a)
print(a.view(3,1,-1).size())
print(a.view([3,1,-1]).size()) #不管加不加上列表符號,最後reshape的結果是一樣的
print(a.view([5,2,-1]).size())

輸出如下:

tensor([[[ 1.6498, -0.4354],
         [-1.0042, -0.1582],
         [ 1.2794, -0.1203],
         [ 0.9198,  2.8475],
         [ 0.0065,  1.5481]],

        [[ 0.7220, -1.1230],
         [ 0.2665, -0.6645],
         [-0.6159, -0.3833],
         [-1.4767,  0.8378],
         [-0.3257,  0.2394]],

        [[ 0.3784,  0.4233],
         [-0.5807,  1.2695],
         [ 1.7632,  0.7828],
         [ 1.0076,  0.6205],
         [ 0.9948, -1.2256]]])
torch.Size([3, 1, 10])
torch.Size([3, 1, 10])
torch.Size([5, 2, 3])

輸出的維度確實為兩個【3,1,10】,以及一個【5,2,3】,說明維度進行了自動的變化。

remark:我們能不能使用view()方法將三維的資料,變成二維的資料呢?

答案顯然也是可以的,假設我們依然使用剛才的程式碼,但是隻是將維度變化成二維,程式碼如下所示:

import torch
a=torch.randn(3,5,2)
print(a.size())
print(a.view([3,-1]).size())

輸出為:

torch.Size([3, 5, 2])
torch.Size([3, 10])

因此,我們使用-1數字自動計算出了其餘的一個維度,同時將三維的資料壓縮為了2維的資料,view方法可謂是非常方便了!