pytorch中的cat、stack、tranpose、permute、unsqeeze

Cat

對數據沿着某一維度進行拼接。cat後數據的總維數不變.

比如下面代碼對兩個2維tensor(分別爲2*3,1*3)進行拼接,拼接完後變爲3*3還是2維的tensor。

import torch

torch.manual_seed(1)

x = torch.randn(2,3)

y = torch.randn(1,3)

print(x,y)

結果:

0.6614 0.2669 0.0617

0.6213 -0.4519 -0.1661

[torch.FloatTensor of size 2x3]

-1.5228 0.3817 -1.0276

[torch.FloatTensor of size 1x3]

將兩個tensor拼在一起:

torch.cat((x,y),0)

結果:

0.6614 0.2669 0.0617

0.6213 -0.4519 -0.1661

-1.5228 0.3817 -1.0276

[torch.FloatTensor of size 3x3]

stack,增加新的維度進行堆疊

 

而stack則會增加新的維度。
如對兩個1*2維的tensor在第0個維度上stack,則會變爲2*1*2的tensor;在第1個維度上stack,則會變爲1*2*2的tensor。
見代碼:

a=torch.rand((1,2))
b=torch.rand((1,2))

c=torch.stack((a,b),0)

c.size()
 

 

結果:

torch.Size([2, 1, 2])

換成維度1:

d=torch.stack((a,b),1)

d.size()

結果:

torch.Size([1, 2, 2])

transpose ,交換維度

代碼:

torch.manual_seed(1)

x = torch.randn(2,3)

print(x)

結果:

0.6614 0.2669 0.0617

0.6213 -0.4519 -0.1661

[torch.FloatTensor of size 2x3]

將x的維度互換:

x.transpose(0,1)

結果:
0.6614 0.6213 
0.2669 -0.4519 
0.0617 -0.1661
 [torch.FloatTensor of size 3x2]

permute,適合多維數據,更靈活的transpose

permute是更靈活的transpose,可以靈活的對原數據的維度進行調換,而數據本身不變。
代碼如下:

x = torch.randn(2,3,4)

print(x.size())

x_p = x.permute(1,0,2) # 將原來第1維變爲0維,同理,0→1,2→2 print(x_p.size())

結果:

torch.Size([2, 3, 4])

torch.Size([3, 2, 4])

squeeze 和 unsqueeze

squeeze(dim_n)壓縮,即去掉元素數量爲1的dim_n維度。同理unsqueeze(dim_n),增加dim_n維度,元素數量爲1。

上代碼:

# 定義張量
import torch

b = torch.Tensor(2,1)
b.shape
Out[28]: torch.Size([2, 1])

# 不加參數,去掉所有爲元素個數爲1的維度
b_ = b.squeeze()
b_.shape
Out[30]: torch.Size([2])

# 加上參數,去掉第一維的元素爲1,不起作用,因爲第一維有2個元素
b_ = b.squeeze(0)
b_.shape 
Out[32]: torch.Size([2, 1])

# 這樣就可以了
b_ = b.squeeze(1)
b_.shape
Out[34]: torch.Size([2])

# 增加一個維度
b_ = b.unsqueeze(2)
b_.shape
Out[36]: torch.Size([2, 1, 1])
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章