【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
返回顶部

显示

忘记密码?

显示

显示

获取验证码

Close