pytorch張量維度操作(拼接、維度擴展、壓縮、轉置、重復……)


涉及的方法有下面幾種:

torch.cat()

torch.Tensor.expand()

torch.squeeze()

torch.Tensor.repeat()

torch.Tensor.narrow()

torch.Tensor.view()

torch.Tensor.resize_()

torch.Tensor.permute()

拼接張量

torch.cat(seq, dim=0, out=None) → Tensor

在指定的維度dim上對序列seq進行連接操作。

參數:

  • seq (sequence of Tensors) - Python序列或相同類型的張量序列
  • dim (int, optional) - 沿着此維度連接張量
  • out (Tensor, optional) - 輸出參數
x = torch.randn(2, 3)
x
-0.5866 -0.3784 -0.1705
-1.0125 0.7406 -1.2073
[torch.FloatTensor of size 2x3]
torch.cat((x, x, x), 0)
-0.5866 -0.3784 -0.1705
-1.0125 0.7406 -1.2073
-0.5866 -0.3784 -0.1705
-1.0125 0.7406 -1.2073
-0.5866 -0.3784 -0.1705
-1.0125 0.7406 -1.2073
[torch.FloatTensor of size 6x3]
torch.cat((x, x, x), 1)
-0.5866 -0.3784 -0.1705 -0.5866 -0.3784 -0.1705 -0.5866 -0.3784 -0.1705
-1.0125 0.7406 -1.2073 -1.0125 0.7406 -1.2073 -1.0125 0.7406 -1.2073
[torch.FloatTensor of size 2x9]

拼接張量2

torch.stack((Tensor), dim)

a = torch.IntTensor([[1,2,3],[11,22,33]])
b= torch.IntTensor([[4,5,6],[44,55,66]])
c=torch.stack([a,b],0)
d=torch.stack([a,b],1)
e=torch.stack([a,b],2)
print(c)
print(d)
print(e)
>>> print(c)
tensor([[[ 1,  2,  3],
         [11, 22, 33]],

        [[ 4,  5,  6],
         [44, 55, 66]]], dtype=torch.int32)
>>> print(d)
tensor([[[ 1,  2,  3],
         [ 4,  5,  6]],

        [[11, 22, 33],
         [44, 55, 66]]], dtype=torch.int32)
>>> print(e)
tensor([[[ 1,  4],
         [ 2,  5],
         [ 3,  6]],

        [[11, 44],
         [22, 55],
         [33, 66]]], dtype=torch.int32)

c, dim = 0時, c = [ a,  b]

d, dim =1 時, d = [ [a[0] ,  b[0] ] ,  [a[1], b[1] ] ]

e, dim = 2 時, e=[ [ [ a[0][0], b[0][0] ], [ a[0][1], b[0][1]], [a[0][2], b[0][2]] ], [ [a[1][0], b[1][0] ], [a[1][1], b[0][1] ], [a[1][2], b[1][2] ] ] ]

擴大張量

torch.Tensor.expand(*sizes) → Tensor

返回張量的一個新視圖,可以將張量的單個維度擴大為更大的尺寸。

張量也可以擴大為更高維,新增加的維度將附在前面。 擴大張量不需要分配新內存,僅僅是新建一個張量的視圖。任意一個一維張量在不分配新內存情況下都可以擴展為任意的維度。

傳入-1則意味着維度擴大不涉及這個維度。

參數:

sizes (torch.Size or int…) – 想要擴展的目標維度

1 x = torch.Tensor([[1], [2], [3]])
2 x.size()
3 torch.Size([3, 1])
4 x.expand(3, 4)
5 1 1 1 1
6 2 2 2 2
7 3 3 3 3
8 [torch.FloatTensor of size 3x4]

壓縮張量

torch.squeeze(input, dim=None, out=None) → Tensor

除去輸入張量input中數值為1的維度,並返回新的張量。如果輸入張量的形狀為(A×1×B×C×1×D),那么輸出張量的形狀為

(A×B×C×D)。

當通過dim參數指定維度時,維度壓縮操作只會在指定的維度上進行。如果輸入向量的形狀為(A×1×B),squeeze(input, 0)會保持張量的維度不變,只有在執行

squeeze(input, 1)時,輸入張量的形狀會被壓縮至(A×B)。

如果一個張量只有1個維度,那么它不會受到上述方法的影響。

輸出的張量與原張量共享內存,如果改變其中的一個,另一個也會改變。

參數:

input (Tensor) – 輸入張量

dim (int, optional) – 如果給定,則只會在給定維度壓縮

out (Tensor, optional) – 輸出張量

 1 x = torch.zeros(2, 1, 2, 1, 2)
 2 x.size()
 3 torch.Size([2, 1, 2, 1, 2])
 4 y = torch.squeeze(x)
 5 y.size()
 6 torch.Size([2, 2, 2])
 7 y = torch.squeeze(x, 0)
 8 y.size()
 9 torch.Size([2, 1, 2, 1, 2])
10 y = torch.squeeze(x, 1)
11 y.size()
12 torch.Size([2, 2, 1, 2])

重復張量

torch.Tensor.repeat(*sizes)

沿着指定的維度重復張量。不同於expand()方法,本函數復制的是張量中的數據。

參數:

  • size (torch.size or int…) - 沿着每一維重復的次數
1 x = torch.Tensor([1, 2, 3])
2 x.repeat(4, 2)
3 1 2 3 1 2 3
4 1 2 3 1 2 3
5 1 2 3 1 2 3
6 1 2 3 1 2 3
7 [torch.FloatTensor of size 4x6]

torch.Tensor.unfold(dim, size, step) → Tensor

返回一個新的張量,其中元素復制於有原張量在dim維度上的數據,復制重復size次,復制時的步進值為step。

參數:

dim (int) - 目標維度

size (int) - 復制重復的次數(展開維度)

step (int) - 步長

例子:

 1 x = torch.arange(1, 8)
 2 x
 3 1
 4 2
 5 3
 6 4
 7 5
 8 6
 9 7
10 [torch.FloatTensor of size 7]
11 x.unfold(0, 2, 1)
12 1 2
13 2 3
14 3 4
15 4 5
16 5 6
17 6 7
18 [torch.FloatTensor of size 6x2]
19 x.unfold(0, 2, 2)
20 1 2
21 3 4
22 5 6
23 [torch.FloatTensor of size 3x2]

縮小張量

torch.Tensor.narrow(dimension, start, length) → Tensor

返回一個經過縮小后的張量。操作的維度由dimension指定。縮小范圍是從start開始到start+length。執行本方法的張量與返回的張量共享相同的底層內存。

參數:

dimension (int) – 要進行縮小的維度

start (int) – 開始維度索引

length (int) – 縮小持續的長度

例子:

 1 x = torch.Tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
 2 x.narrow(0, 0, 2)
 3 1 2 3
 4 4 5 6
 5 [torch.FloatTensor of size 2x3]
 6 x.narrow(1, 1, 2)
 7 2 3
 8 5 6
 9 8 9
10 [torch.FloatTensor of size 3x2]

張量變形

torch.Tensor.view(*args) → Tensor

返回一個有相同數據但是不同形狀的新的向量。

返回的裝兩必須與原張量有相同的數據和相同的元素個數,但是可以有不同的尺寸。

參數:

  • args (torch.Size or int…) - 理想的指定尺寸
1 x = torch.randn(4, 4)
2 x.size()
3 torch.Size([4, 4])
4 y = x.view(16)
5 y.size()
6 torch.Size([16])

重設張量尺寸

torch.Tensor.resize_(*sizes)

將張量的尺寸調整為指定的大小。如果元素個數比當前的內存大小大,就將底層存儲大小調整為與新元素數目一致的大小。

如果元素個數比當前內存小,則底層存儲不會被改變。原來張量中被保存下來的元素將保持不變,但新內存將不會被初始化。

參數:

sizes (torch.Size or int…) - 需要調整的大小

1 x = torch.Tensor([[1, 2], [3, 4], [5, 6]])
2 x.resize_(2, 2)
3 x
4 1 2
5 3 4
6 [torch.FloatTensor of size 2x2]

置換張量維度

torch.Tensor.permute(*dims)

將執行本方法的張量的維度換位。

參數:

  • dim (int) - 指定換位順序

例子:

1 x = torch.randn(2, 3, 5)
2 x.size()
3 torch.Size([2, 3, 5])
4 x.permute(2, 0, 1).size()
5 torch.Size([5, 2, 3])

查看張量單個元素的字節數

torch.Tensor.element_size() → int

查看某類型張量單個元素的字節數。

1 torch.FloatTensor().element_size()
2 4

 

---------------------
作者:藍鯨123
來源:CSDN
原文:https://blog.csdn.net/TH_NUM/article/details/83088915
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!


免責聲明!

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



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