Pytorch入门之张量

PyTorch是什么?

这是一个基于Python的科学计算包,其旨在服务两类场合:

  • 替代numpy发挥GPU潜能
  • 一个提供了高度灵活性和效率的深度学习实验性平台

第一个概念:张量tensors

pytorch下的张量类似于numpy下的数组,并且张量也可用于在GPU上对程序进行加速

创建(5,3)的数据:

数组:numpy.empty([5, 3])

张量:torch.empty(5, 3)

运行结果:

数组

张量

note:numpy下创建多维数组,参数要是一个列表;torch下只需直接输入数字;同理初始化张量的方式还有ones、zeros。

创建随机数

显然,pytorch创建随机数更方便

创建指定内容的张量

张量和数组的继承

note:数组没有new_ones这种方法

张量和数组创建正态分布的数据

note:数组没有randn_like这种继承方式

size的用法

数组和张量的用法是不一样的,数组返回元素个数,张量返回其规模,类似于shape

add用法(总算来了一个数组和张量都一样的用法)

note:注意一下,使用add函数会生成一个新的tensor变量, add_ 函数会直接再当前tensor变量上进行操作,于函数名末尾带有"_" 的函数都是会对Tensor变量本身进行操作的。add_是针对类的方法,而不能当函数调用

更改数组或张量的规模reshape、view

note:对于张量,reshape和view都可以用,但数组没有view这个用法

张量转化为数组

必须要强调一下,数组和张量相互转化时候,两者共用一个存储地址,因此两者的相互转化会非常快

张量转为数组

数组转为张量 调用函数from_numpy

从最后4行结果也可以看出,从数组转化而来的张量和数组共用一个地址

张量乘法

矩阵乘法、对应位置相乘

张量的增维和减维(挤维) unsqueeze、squeeze

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

1、当不给定dim时,将输入张量形状中的1 去除并返回

2、当给定dim时,那么挤压操作只在给定维度上,当这个给定的dim为1的时候,才有效,否则,函数是无效的

3、返回张量与输入张量共享内存,所以改变其中一个的内容会改变另一个。

4、dim为负数时候,-1表示最后一个,以此类推,如数据的维度(2,3,1),squeeze(input,-1)降低第二维成(2,3)

torch.unsqueeze(input, dim, out=None)

1、给定的dim是最终生成的dim,不如dim=2,是最终生成的张量中,第二维的大小为1

2、返回张量与输入张量共享内存,所以改变其中一个的内容会改变另一个。

3、dim为负数时候,-1表示最后一个,以此类推,如数据的维度(2,3),unsqueeze(input,-1)降低第二维成(2,3,1)

堆叠函数stack:用于扩展张量的维数

调用格式  d=torch.stack( (a,b,c) ,dim)  其中a、b、c为相同维数的张量,dim为指定的张量堆积方向。如abc分别为二维张量,dim=0,表明形成三维张量后第0维为堆积方向。

先来看一下三维的数据大致的形状,三维是几个2维数据按一定方向堆叠起来的,但不管怎么堆叠,可以始终看成一个长方体

以此类推

以具体例子来看

abc分别为(2,4)的二维张量

当dim=0,表明3张平面向着第0轴的方向堆叠,故容易得出最后的规模为(3,2,4)

然后用数据验证下:

继续,当dim=1时,表明3张平面按第1维的方向堆叠,易得出最后的规模(2,3,4)

验证:

继续,当dim=2,表明3个平面按第2轴的方向堆叠,容易的出最后的张量规模(2,4,3)

验证:

需要注意的是,d=torch.stack( (a,b,c) ,dim) ,表示堆叠的时候,按abc的顺序依次向着堆叠方向放平面,顺序不要错了。

CUDA张量,将张量移送到GPU上进行运算

脚本的运行时间将比cpu下快很多

张量的复制

运用 clone、detach函数

clone():完全复制、开辟新内存,仍留在计算图中,即参与梯度运算

detach():完全复制,和原变量为同一内存,但离开计算图

clone().detach():完全复制,开辟新内存,离开计算图

张量的求平均

运用mean函数,通过设置参数,该函数具有降维的作用,具体来看

调用格式:torch.mean(x, dim, keepdim)

x为求取平均的tensor对象,需要为float型,dim为指定维的反向求平均,keepdim为保持输出维度,True时为指定的dim维度+1,False为默认值,即不保持输入维度,即dim维度消失,实现了降维。

接下来看3个例子就可以明白这个函数具体怎么工作了:

第一个例子

x = torch.rand(4, 2, 3)  #三维张量
x1 = torch.mean(x, dim=0, keepdim=True)  #因为keepdim=True,所以x1维度保持3维
x2 = torch.mean(x1, dim=1, keepdim=True)  #因为keepdim=True,所以x2维度保持3维
x3 = torch.mean(x2, dim=2, keepdim=True)  #因为keepdim=True,所以x3维度保持3维

输出

第二个例子

x = torch.rand(4, 2, 3)
x1 = torch.mean(x, dim=0)  #keepdim=False,则x1为2维张量
x2 = torch.mean(x1, dim=0, keepdim=True)
x3 = torch.mean(x2, dim=1, keepdim=True)

第三个例子

x4 = torch.mean(x),无任何参数,直接降成标量

猜你喜欢

转载自blog.csdn.net/MR_kdcon/article/details/108900039