tensor的維度變換


tensor的維度變換

view以及reshape的用法

例子:

a = torch.rand(4,1,28,28)
a.view(4,28*28)

解讀:其實就是將圖片的通道數、圖片的像素行列值都合並在一起,成為【4,784】,適合全連接層的輸入。

例子2:

a = torch.rand(4,1,28,28)
a.view(4*1,28,28)

表示我們現在只關注feature map這個屬性,而不關注它來自哪個圖片的哪個通道

注意在view之后如果想恢復到原來的維數是要進行記錄的,否則直接恢復是不行的。

squeeze與unsqueeze用法

unsqueeze

在相應的index的維度添加一維

例子:

a = torch.rand(4,1,28,28)
a.unsqueeze(0)
a.shape
#[1,4,1,28,28]

unsqueeze的參數是index,而index的范圍是[-a.dim()-1,a.dim()+1)

-5 -4  -3   -2   -1
[   4 , 1 , 28 , 28 ]
    0   1    2    3    4

如果是0 1 2 3 4的話就是在0 1 2 3 4的前面插入一維,而如果是-5 - 4- 3- 2 -1的話就是在-5 - 4- 3- 2 -1的后面插入一維

⭐例子二:

a = a.torch.tensor([1.2,2.3])#這里的數據的維度為【2】
a.unsqueeze(-1)#在最后一個后面添加一維:【2,1】
#[ [1.2] , [2.3]   ]    於是就是先是兩維,然后是一維

a.unsqueeze(0)#在第一維前面添加一維“【1,2】
#[ [1.2 , 2.3] ]         於是就是先是一維,里面是兩維

⭐實例:

f表示4張14*14的擁有32個通道的圖片,而b表示給圖片的每個channel上的所有的像素添加一個偏置,我們的目標就是把b疊加在f上面,所以要將b的維度變換與f相同才可以進行,然后再進行b的擴張。

b = torch.rand(32)
f = torch.rand(4,32,14,14)
b = b.unsqueeze(1).unsqueeze(2).unsqueeze(0)
#[32]      [32,1]      [32,1,1]       [1,32,1,1]    

squeeze

刪減維度,如果沒有參數的話會把所有能進行刪減的都刪減了。

例子:

b = torch.randn(1,32,1,1)
b = b.squeeze()#所有維數是1的全部刪掉
#[32]

squeeze的索引是指哪個就刪哪個,除非該維度的維數不是1就不能刪

expand與repeat用法

進行維度的擴展,就像前面的b【1,32,14,14】,要想與f【4,32,14,14】進行相加的話,b就要進行維度的擴展。

兩種方法的區別:

兩種方法在效果方面是等效的,但是expand只在需要的時候進行數據的復制,而repeat會直接復制數據。所以推薦使用expand

expand

例子:

b = torch.randn(1,32,1,1)
b.expand(4,32,14,14)
#[4,32,14,14]

局限性:

1.要求expand之前之后的dimension必須一樣。

2.只能在之前維數為1的地方進行expand,而如果之前的維數為3是沒有辦法擴張到m的。

【3,32,14,14】——b.expand(4,32,14,14)報錯

例子2:不像進行變動的地方使用-1代替就可以

b = torch.randn(1,32,1,1)
b.expand(4,32,-1,-1)
#[4,32,1,1]

repeat

repeat的參數表示你要在該維數位置進行多少次復制

例子:

b = torch.randn(1,32,1,1)
b.repeat(4,32,1,1)
#[ 4 , 1024 , 1 , 1 ]

表示1復制4次變為4,32復制32次變為1024,其它沒變

.t()轉置

進行tensor的轉置,但是要注意:只能進行2D tensor的轉置,即矩陣的轉置。

transpose轉置

進行某幾維之間的相互交換

例子:

b = torch.randn(4,3,32,32)
b = b.transpose(1,3)
#[4,32,32,3]
# 0  1  2  3	

例子2:這樣變換前后的二者是一樣的(contiguous()表示進行transpose之后數據不再是按順序存放的,使用該方法進行順序的調整)

a2 = b.transpose(1,3).contiguous().view(4,3*32*32).view(4,3,32,32).transpose(1,3)

注意:[B C H W] → [B W H C] → [B W * H * C] →[B C W H]這樣的變換是不行的 W與H的順序變換了,圖像也會處出現變換

⭐例子3:

a = torch.rand(4,3,28,28)#[B C H W]
a.transpose(1,3)#[B W H C]
a.transpose(1,2)#[B H W C]

由於[B H W C]是numpy中儲存圖片的方式,所以這樣變換以后才能導出numpy

permute函數

transpose中的例子3使用permute函數進行簡單的一步變換:

a = torch.rand(4,3,28,28)#[B C H W]
a.permute(0,2,3,1)#[B H W C]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM