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),无任何参数,直接降成标量