【PyTorch笔记-01】初识PyTorch

人终其一生应该有所追求,但这种追求不应该仅仅局限在金钱上,它应该是一个特殊的,却普遍存在无人提及的东西。——Wicos 写在前面

一,创建Tensor的几种方法

前提:import torch as t 1,Tensor(x,y)

a = t.Tensor(2,3) #创建一个2行3列的张量

2,ones(x,y)

a = t.ones(2,3) #创建一个2行3列的全1张量

3,zeros(x,y)

a = t.zeros(2,3) #创建一个2行3列的全0张量

4,eye(x,y)

a = t.eye(2,3) #创建一个2行3列对角线为1的张量,其中不要求行列数相同,1从左上角第一个数字开始对角扩张。如本例的输出a为: [[1.,0.,0.] [0.,1.,0.]]

5,arange(x,y,z)

a = t.arange(1,6,1) #创建一个一维张量,从1开始到5结束,步长为1。 其创建的是torch.Tensor 如:>>>type(a) ->  <class ‘torch.Tensor’>

6,linspace(x,y,z)

a = t.linspace(1,5,4) #创建一个一维张量,从1至5平均分成3份,共4个元素。 ->tensor([1.0000, 2.3333, 3.6667, 5.0000])

7,rand(x,y)

a = rand(2,5) #创建一个2行5列的均匀张量

8,randn(x,y)

a = randn(2,5) #创建一个2行5列的平均张量

9,normal(mean,std)/uniform(from,to)

#正态分布/均匀分布

10,ramdperm(x)

a = t.randperm(5) #创建一个一维的随机张量,内又5个元素。

11,shape,size

a.shape 与 a.zize() 得到的结果相同,注意shape后无括号,size后有括号。

12,tolist()

a.tolist() #tensor可以转换为list

13,numel()/nelement()

a.numel与a.nelement()等效,都可以返回tensor元素总个数。

14,创建Tensor时,可以在创建的时候指定数据类型dtype和存放device(cpu/gpu)。 15,view(x,y)

b = a.view(2,3) #若a内原本元素有6个,可以重新转化为2行3列的张量。 注:view只会修改tensor的形状,不会修改数据,并且要保证前后元素相等。 当view内值有-1时,和shape,size()等效。即计算它的大小。

16,squeeze()

b = a.squeeze() #把所有维度为1的压缩 b = a.squeeze(0) #压缩0维的1

17,unsqueeze(x)

b = a.unsqueeze(1) #在第1维上增加1

18,resize_()

a.resize_(2,3) #将原来的tensor转换为2行,3列的tensor,如果新生成的张量元素多于旧张量元素,则自动补充新内容,反之,保留原内容。

二,索引操作

a = t.randn(3,4) 19,a[x][y] == a[x,y]

a[2][3] #获取第2行第3列的元素 与 a[2,3]等效

20,a[:x]

a[:2] #获取前两行元素

21,a[x:y,m:n]

a[:2,0:1] #获取前两行,第一列 a[0:1,:2] #获取第0行,前两列 二者形状不同,数据也不同

三:逐元素操作

函数

功能

abs/sqrt/div/exp/fmod/log/pow..

绝对值/平方根/除法/指数/求余/求幂..

cos/sin/asin/atan2/cosh..

相关三角函数

ceil/round/floor/trunc

上取整/四舍五入/下取整/只保留整数部分

clamp(input, min, max)

超过min和max部分截断

sigmod/tanh..

激活函数

部分可以进行运算符直接操作,如

a = t.arange(0,6,1).view(2,3) b = t.pow(a,2) -> [[0,1,4] [9,16,25]] 与a**2等效

四,归并

函数

功能

mean/sum/median/mode

均值/和/中位数/众数

norm/dist

范数/距离

std/var

标准差/方差

cumsum/cumprod

累加/累乘

归并操作中大部分都有dim参数,决定在那个维度上执行操作。 假设输入的形状是(m, n, k)

  • 如果指定dim=0,输出的形状就是(1, n, k)或者(n, k)
  • 如果指定dim=1,输出的形状就是(m, 1, k)或者(m, k)
  • 如果指定dim=2,输出的形状就是(m, n, 1)或者(m, n)

size中是否有”1”,取决于参数keepdimkeepdim=True会保留维度1。 注意,以上只是经验总结,并非所有函数都符合这种形状变化方式,如cumsum

a = t.arange(0,6,1).view(2,3)

五,比较

函数

功能

gt/lt/ge/le/eq/ne

大于/小于/大于等于/小于等于/等于/不等

topk

最大的k个数

sort

排序

max/min

比较两个tensor最大最小值

表中第一行的比较操作已经实现了运算符重载,因此可以使用a>=ba>ba!=ba==b,其返回结果是一个ByteTensor,可用来选取元素。max/min这两个操作比较特殊,以max来说,它有以下三种使用情况:

  • t.max(tensor):返回tensor中最大的一个数
  • t.max(tensor,dim):指定维上最大的数,返回tensor和下标
  • t.max(tensor1, tensor2): 比较两个tensor相比较大的元素。

六,线性代数

函数

功能

trace

对角线元素之和(矩阵的迹)

diag

对角线元素

triu/tril

矩阵的上三角/下三角,可指定偏移量

mm/bmm

矩阵乘法,batch的矩阵乘法

addmm/addbmm/addmv/addr/badbmm..

矩阵运算

t

转置

dot/cross

内积/外积

inverse

求逆矩阵

svd

奇异值分解

注:矩阵转置后存储空间不连续,因此要使用.contiguous方法将其转为连续。

总结:

一,对tensor “维”的理解 在pytorch中,多种操作都涉及到“维”(dimension),如

import torch as t a = t.arange(0,8,1).view(2,2,2) a.dim() ->3 #表示张量a有三个维度,分别是0,1,2 a.sum() #默认操作作用在所有元素上 -> tensor(28) a.sum(dim = 0) ->trnsor([[4,6], [8,10]]) a.sum(dim = 1) ->tensor([[2,4], [10,12]]) a.sum(dim = 2) ->tensor([1,5], [9,13])

通过对比可以看出同一个sum操作在dim不同的情况下得到的结果是不同的,因为此操作作用在不同的“维”。 当输出格式维张量时不方便看出,经过简单的tolist操作便可以更直观的理解

b = a.tolist() print(b) -> [[[0,1],[2,3]],[[4,5],[6,7]]]

  • 当dim = 0时,可以理解为操作[[A],[B]],A与B对应操作,得到的结果时[[4,6],[8,10]]。
  • 当dim = 1时,可以理解为[[[A],[B]],[[C],[D]]],A,B对应操作后再对C,D对应操作,得到[[2,4],[10,12]]。
  • 当dim = 2时,可以理解为[[[A],[B]],[[C],[D]]],逐个对A,B,C,D内两元素对应操作,得到[[1,5],[9,3]]。

为了进一步加深理解,a时一个张量,其为: a = tensor([[[0, 1], [2, 3]], [[4, 5], [6, 7]]]) b = [[[0, 1], [2, 3]], [[4, 5], [6, 7]]]

  • 操作a内元素时,a[0,0,1] 为 tensor(1)
  • 操作b内元素时,b[0][0][1]为1

当tensor和list对比操作时,更容易理解tensor中的维这个概念。 ——Wicos 2020.1.19


【PyTorch笔记-01】初识PyTorch
https://www.wicos.me/jishu/839/
作者
Wicos
发布于
2020年1月18日
许可协议