1. 程式人生 > >Pytorch常用函式積累

Pytorch常用函式積累

Pytorch中文文件
1、torch.index_select(input, dim, index, out=None) → Tensor

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

 1.2045  2.4084  0.4001  1.1372
 0.5596  1.5677  0.6219 -0.7954
 1.3635 -1.2313 -0.5414 -1.8478
[torch.FloatTensor of size 3x4]

>>> indices = torch.LongTensor([0, 2])
>>> torch.index
_select(x, 0, indices) 1.2045 2.4084 0.4001 1.1372 1.3635 -1.2313 -0.5414 -1.8478 [torch.FloatTensor of size 2x4] >>> torch.index_select(x, 1, indices) 1.2045 0.4001 0.5596 0.6219 1.3635 -0.5414 [torch.FloatTensor of size 3x2]

在指定維度dim方向上從input中抽取由位置序列index所指定的值。output的其他維度的長度和原來矩陣相同,在第dim維度上的長度和index的長度相同。

2、 pytorch的數學操作
mm與dot
Pytorch 的 mm 是矩陣的外積,而dot是元素對應積,即對應位置的元素相乘,需要左右矩陣形狀一致。這點和numpy、mxnet不一樣。

torch.div()
torch.div(input, value, out=None)
將input逐元素除以標量值value,並返回結果到輸出張量out。 即 out=tensor/value
如果輸入是FloatTensor or DoubleTensor型別,則引數 value 必須為實數,否則須為整數。【譯註:似乎並非如此,無關輸入型別,value取整數、實數皆可。】
引數:
input (Tensor) – 輸入張量
value (Number) – 除數
out (Tensor, optional) – 輸出張量
torch.svd()


torch.svd(input, some=True, out=None) -> (Tensor, Tensor, Tensor)
U,S,V=torch.svd(A)。 返回對形如 n×m的實矩陣 A 進行奇異值分解的結果,使得 A=USV’∗。 U 形狀為 n×n,S 形狀為 n×m ,V 形狀為 m×m

some 代表了需要計算的奇異值數目。如果 some=True, it computes some and some=False computes all.
引數:
input (Tensor) – 輸入的2維張量
some (bool, optional) – 布林值,控制需計算的奇異值數目
out (tuple, optional) – 結果tuple

>>> a = torch.Tensor([[8.79,  6.11, -9.15,  9.57, -3.49,  9.84],
...                   [9.93,  6.91, -7.93,  1.64,  4.02,  0.15],
...                   [9.83,  5.04,  4.86,  8.83,  9.80, -8.99],
...                   [5.45, -0.27,  4.85,  0.74, 10.00, -6.02],
...                   [3.16,  7.98,  3.01,  5.80,  4.27, -5.31]]).t()
>>> a

  8.7900   9.9300   9.8300   5.4500   3.1600
  6.1100   6.9100   5.0400  -0.2700   7.9800
 -9.1500  -7.9300   4.8600   4.8500   3.0100
  9.5700   1.6400   8.8300   0.7400   5.8000
 -3.4900   4.0200   9.8000  10.0000   4.2700
  9.8400   0.1500  -8.9900  -6.0200  -5.3100
[torch.FloatTensor of size 6x5]

>>> u, s, v = torch.svd(a)
>>> u

-0.5911  0.2632  0.3554  0.3143  0.2299
-0.3976  0.2438 -0.2224 -0.7535 -0.3636
-0.0335 -0.6003 -0.4508  0.2334 -0.3055
-0.4297  0.2362 -0.6859  0.3319  0.1649
-0.4697 -0.3509  0.3874  0.1587 -0.5183
 0.2934  0.5763 -0.0209  0.3791 -0.6526
[torch.FloatTensor of size 6x5]

>>> s

 27.4687
 22.6432
  8.5584
  5.9857
  2.0149
[torch.FloatTensor of size 5]

>>> v

-0.2514  0.8148 -0.2606  0.3967 -0.2180
-0.3968  0.3587  0.7008 -0.4507  0.1402
-0.6922 -0.2489 -0.2208  0.2513  0.5891
-0.3662 -0.3686  0.3859  0.4342 -0.6265
-0.4076 -0.0980 -0.4932 -0.6227 -0.4396
[torch.FloatTensor of size 5x5]

>>> torch.dist(a, torch.mm(torch.mm(u, torch.diag(s)), v.t()))
8.934150226306685e-06

torch.diag
torch.diag(input, diagonal=0, out=None) → Tensor
如果輸入是一個向量(1D 張量),則返回一個以input為對角線元素的2D方陣
如果輸入是一個矩陣(2D 張量),則返回一個包含input對角線元素的1D張量

引數diagonal指定對角線:
diagonal = 0, 主對角線
diagonal > 0, 主對角線之上
diagonal < 0, 主對角線之下

input (Tensor) – 輸入張量
diagonal (int, optional) – 指定對角線
out (Tensor, optional) – 輸出張量
例如:
取得以input為對角線的方陣:

>>> a = torch.randn(3)
>>> a

 1.0480
-2.3405
-1.1138
[torch.FloatTensor of size 3]

>>> torch.diag(a)

 1.0480  0.0000  0.0000
 0.0000 -2.3405  0.0000
 0.0000  0.0000 -1.1138
[torch.FloatTensor of size 3x3]

>>> torch.diag(a, 1)

 0.0000  1.0480  0.0000  0.0000
 0.0000  0.0000 -2.3405  0.0000
 0.0000  0.0000  0.0000 -1.1138
 0.0000  0.0000  0.0000  0.0000
[torch.FloatTensor of size 4x4]

取得給定矩陣第k個對角線:

>>> a = torch.randn(3, 3)
>>> a

-1.5328 -1.3210 -1.5204
 0.8596  0.0471 -0.2239
-0.6617  0.0146 -1.0817
[torch.FloatTensor of size 3x3]

>>> torch.diag(a, 0)

-1.5328
 0.0471
-1.0817
[torch.FloatTensor of size 3]

>>> torch.diag(a, 1)

-1.3210
-0.2239
[torch.FloatTensor of size 2]

3、torch.unsqueeze 與 torch.squeeze
torch.unsqueeze
torch.unsqueeze(input, dim, out=None)
返回一個新的張量,對輸入的制定位置插入維度 1
注意: 返回張量與輸入張量共享記憶體,所以改變其中一個的內容會改變另一個。

如果dim為負,則將會被轉化dim+input.dim()+1
引數:
tensor (Tensor) – 輸入張量
dim (int) – 插入維度的索引
out (Tensor, optional) – 結果張量

>>> x = torch.Tensor([1, 2, 3, 4])
>>> torch.unsqueeze(x, 0)
 1  2  3  4
[torch.FloatTensor of size 1x4]
>>> torch.unsqueeze(x, 1)
 1
 2
 3
 4
[torch.FloatTensor of size 4x1]

torch.squeeze
torch.squeeze(input, dim=None, out=None)
將輸入張量形狀中的1 去除並返回。 如果輸入是形如(A×1×B×1×C×1×D),那麼輸出形狀就為: (A×B×C×D)
當給定dim時,那麼擠壓操作只在給定維度上。例如,輸入形狀為: (A×1×B), squeeze(input, 0) 將會保持張量不變,只有用 squeeze(input, 1),形狀會變成 (A×B)。

注意: 返回張量與輸入張量共享記憶體,所以改變其中一個的內容會改變另一個。

引數:

input (Tensor) – 輸入張量
dim (int, optional) – 如果給定,則input只會在給定維度擠壓
out (Tensor, optional) – 輸出張量

>>> x = torch.zeros(2,1,2,1,2)
>>> x.size()
(2L, 1L, 2L, 1L, 2L)
>>> y = torch.squeeze(x)
>>> y.size()
(2L, 2L, 2L)
>>> y = torch.squeeze(x, 0)
>>> y.size()
(2L, 1L, 2L, 1L, 2L)
>>> y = torch.squeeze(x, 1)
>>> y.size()
(2L, 2L, 1L, 2L)

4、expand(*sizes)
返回tensor的一個新檢視,單個維度擴大為更大的尺寸。 tensor也可以擴大為更高維,新增加的維度將附在前面。 擴大tensor不需要分配新記憶體,只是僅僅新建一個tensor的檢視,其中通過將stride設為0,一維將會擴充套件位更高維。任何一個一維的在不分配新記憶體情況下可擴充套件為任意的數值。

引數: sizes(torch.Size or int…) 需要擴充套件的大小

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

expand_as(tensor)
將tensor擴充套件為引數tensor的大小。 該操作等效與:

self.expand(tensor.size())

5、index_copy_(dim, index, tensor) → Tensor
按引數index中的索引數確定的順序,將引數tensor中的元素複製到原來的tensor中。引數tensor的尺寸必須嚴格地與原tensor匹配,否則會發生錯誤。

引數:
- dim (int)-索引index所指向的維度
- index (LongTensor)-需要從tensor中選取的指數
- tensor (Tensor)-含有被複制元素的tensor.

>>> x = torch.Tensor(33)
>>> t = torch.Tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
>>> index = torch.LongTensor([0, 2, 1])
>>> x.index_copy_(0, index, t)
>>> x
  1 2 3
  7 8 9
  4 5 6
[torch.FloatTensor of size 3x3]