tensor的維度變換

2021-10-24 04:02:27 字數 3453 閱讀 3918

expand與repeat用法

.t()轉置

transpose轉置

permute函式

例子:

a = torch.rand(4,

1,28,

28)a.view(4,

28*28)

例子2:

a = torch.rand(4,

1,28,

28)a.view(4*

1,28,

28)

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

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

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]

0123

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])

#這裡的資料的維度為

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就不能刪

進行維度的擴充套件,就像前面的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,其它沒變

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

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

例子:

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

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

a = torch.rand(4,

3,28,

28)#[b c h w]

a.permute(0,

2,3,

1)#[b h w c]

tensor 增加維度 tensor維度變換

維度變換是tensorflow中的重要模組之一,前面mnist實戰模組我們使用了資料的壓平操作,它就是維度變換的應用之一。在詳解維度變換的方法之前,這裡先介紹一下view 檢視 的概念。所謂view,簡單的可以理解成我們對乙個tensor不同維度關係的認識。舉個例子,乙個 b,28,28,1 的te...

Tensor的建立和維度的檢視

常見的tensor建立方法 1,基礎tensor函式 torch.tensor 2,2 32位浮點型 2,指定型別 torch.doubletensor 2,2 64位浮點型 3,使用python的列表序列 torch.tensor 1,2 3,4 4,預設值為0 torch.zeros 2,3 5...

TensorFlow 維度變換

基本的維度變換包含了改變檢視 reshape,插入新維度 expand dims,刪除維 squeeze,交換維度 transpose,複製資料 tile 等。四 交換維度 五 資料複製 六 broadcasting 自動擴充套件 張量的檢視就是我們理解張量的方式,比如shape 為 2,4,4,3...