您的位置:首页 > 其它

Pytorch常用函数积累

2018-03-26 11:40 447 查看
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
4000
.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(3, 3)
>>> 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]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: