




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
张量的概念及使用(上)张量的概念及使用01张量的概念
tensor即“张量”,是一种数据结构,实际上跟numpy数组、向量、矩阵的格式基本一样。但是是专门针对GPU来设计的,可以运行在GPU上来加快计算效率。
可以简单理解为:一个可以运行在gpu上的多维数据。Tensor的使用01Torch.device()设备类型我们学习到了张量的基本使用,那么在神经网络中,张量有哪些常见的使用呢?Torch.device()表现了torch.Tensor被分配的设备类型的类,其中分为‘cpu’和‘cuda’两种类型。可以通过torch.cuda.current_device()返回当前设备标号,也可以通过tensor.device()来获取其属性。具体操作如下所示:>>>importtorch#导包>>>torch.device('cuda')#使用当前的cuda设备device(type='cuda')>>>torch.device('cpu')#设置当前设备为CPUdevice(type='cpu')Tensor的使用01
可以利用字符或字符+序号的方式来分配设备,如果设备序号没有显示则表示此tensor被分配到当前设备。#通过字符串和设备号设置>>>torch.device('cuda',0)#设置当前设备为0号cudadevice(type='cuda',index=0)>>>torch.device('cpu',0)
#设置当前设备为0号cpudevice(type='cpu',index=0)Tensor的使用01通过代码自动分配>>>device=torch.device(“cuda”iftorch.cuda.is_available()else“cpu”)#通用
张量的设备分配>>>data=torch.Tensor([1])#声明一个Tensor>>>data.to(device)tensor([1.])#Tensor置于cpu设备上>>>data.to(device)
tensor([1.],device='cuda:0')#Tensor置于cuda设备上Tensor的使用01创建一维、二维、三维张量a=torch.Tensor([1,2,3])b=torch.Tensor([[1,2,3],[4,5,6]])c=torch.Tensor([[[1,2,3],[4,5,6],[7,8,9]]])print('一维张量:',a)print('二维张量:',b)print('三维张量:',c)代码:结果:torch.Tensor(list):根据列表创建多维张量,维度一致Tensor的使用01创建全零/全1张量input=torch.zeros(2)#一维全0张量print(input)print(torch.zeros(2,3))#2行3列的全0张量print(torch.ones(2,3))#2行3列的全1张量print(torch.zeros_like(input))#打印与input相同大小的全0张量print(torch.ones_like(input))#打印与input相同大小的全1张量代码:结果:torch.zeros(*sizes,out=None,..)/torch.ones(*sizes,out=None,..):返回大小为sizes的对应全零/全1张量torch.zeros_like(input,..)/torch.ones_like(input,..):返回与input相同尺寸的对应全零/全1张量Tensor的使用01创建全x张量print(torch.full((3,4),3.14))#3行4列全3.14张量print(torch.full_like(input,2.3))#打印与input相同大小的全2.3矩阵量代码:结果:torch.full(size,fill_value,…)返回大小为size,各元素值都为fill_value的张量Tensor的使用01等差数列张量print(torch.arange(2,8))#默认单位步长是1的等差数列张量print(torch.linspace(2,10,steps=5))#步长为2的等差数列代码:结果:torch.arange(start=0,end,step=1,…)函数,返回结果为[start,end),步长为step的张量等比数列张量torch.linspace(start,end,steps=100)返回从[start,end],间隔中的插值数目为steps的tensor。torch.logspace(start,end,steps=100,base=10)返回steps个从base^start到base^end的等比数列。print(torch.logspace(1,3,steps=3,base=10))#以10为公倍数的等比代码:结果:Tensor的使用01随机张量input=torch.eye(3)#3维单位对角张量print(torch.rand(2,2))#2行2列的[0,1]均匀分布随机数print(torch.rand_like(input))#3行3列的[0,1]均匀分布随机数print(torch.randint(1,10,(2,2)))#2行2列的[1,10]均匀分布随机数print(torch.randn(2,2))#2行2列的标准正态分布随机数代码:结果:torch.rand(*size,out=None,dtype=None,…)返回[0,1]之间均匀分布的随机数值,形状大小由size决定torch.rand_like(input)随机数满足[0,1]均匀分布,形状大小由input决定torch.randint(low=0,high,size,…)返回均匀分布的[low,high]之间的整数随机值。torch.randn(*sizes,out=None,…)返回大小为sizes,均值为0,方差为1的标准正态分布的随机数值。张量的概念及使用(下)Tensor的使用01张量维度扩大Tensor.expand(*sizes):返回tensor的一个新视图,单个维度扩大为更大的尺寸,也可以扩大为更高维。扩大tensor不需要分配新内存,只是仅仅新建一个tensor的视图。x=torch.tensor([[1],[2],[3]])print(x.size())print(x.expand(3,4))#维度扩大为3行4列print(x.expand(-1,2))#-1表示自动计算数值print(x)代码:结果:Tensor的使用01张量维度重复Tensor.repeat(*sizes)沿着指定的维度重复tensor,不同于expand(),本函数复制的是tensor中的数据。x=torch.tensor([1,2,3])#定义一个1*3tensorprint(x.repeat(4,2))#复制x中的元素值使变成4*6的tensor(1*4,2*3)print(x)print(x.repeat(4,2,1).size())#复制x中的元素变成3个维度:[4,2,3]代码:结果:Tensor的使用01维度扩展前面学到过torch.squeeze()函数进行压缩,去除tensor维度。torch.unsqueeze(input,dim,out=None)函数主要是进行扩展,第二个参数为0时,数据是行方向扩,为1时是列方向扩。x=torch.tensor([1,2,3,4])print(torch.unsqueeze(x,0))#向行方向扩展print(x.unsqueeze(1))#向列方向扩展代码:结果:Tensor的使用01改变维度方式一:torch.reshape(input,shape)返回与输入相同的数据,但具有指定形状的tensor。方式二:Tensor.reshape(shape)返回与输入相同的数据,但具有指定形状的tensor。a=torch.arange(6)#生成tensorb=torch.reshape(a,(3,2))#重新组合形状为3*2c=a.reshape(2,-1)#重新组合形状为2*3print(b)print(c)代码:结果:Tensor的使用01维度交换
torch.transpose(input,dim0,dim1)将张量按指定的2个维度交换位置,实现类似矩阵转置的操作。x=torch.randint(1,10,(2,3))#生成2行3列[1,10]之间的随机整数print(x)print(torch.transpose(x,0,1))#将0维与1维调换位置代码:结果:Tensor的使用01转换成数值item()在提取损失值的时候,常常会用到loss.item(),其返回值是一个Python数值(pythonnumber)。item()将tensor格式转化为python的数据类型格式。注意item()只适用于tensor只包含一个元素的时候。因为大多数情况下我们的损失值就只有一个元素,所以就经常会用到loss.item()。如果想把含多个元素的tensor转换成Pythonlist的话,要使用tensor.tolist()。Tensor的使用01x=torch.randn(1)#随机生成1个1*1的正态分布tensorprint(x)y=x.item()#使用item()获取数值print(y,type(y))#打印类型x=torch.randn([2,2])#随机生成1个2*2的正态分布tensory=x.tolist()#使用tolist获取转换为listprint(y)代码:结果:张量求导机制Tensor张量求导机制02在PyTorch中,autograd是所有神经网络的核心内容,为Tensor所有操作提供自动求导方法。autograd.Variable是autograd中最核心的类。它包装了一个Tensor,并且几乎支持所有在其上定义的操作。Variable是一种可以不断变化的量,符合反向传播,参数更新的属性,可以称作变量。完成运算之后,在后续可以调用.backward()来自动计算出所有的梯度。注意:新版本中,torch.autograd.Variable和torch.Tensor将同属一类。是否需要求梯度梯度值求梯度对应的函数类型Tensor张量求导机制02importtorch#导包torchfromtorch.autogradimportVariable#导包Variablex=Variable(torch.Tensor([5]),requires_grad=True)#创建变量x,并设置需要求导y=2*x+2#线性运算print(y,'\n','y的类型是',y.type())#打印y的内容和类型print(y.grad_fn)
#打印y的函数类型y.backward()
#反向传播print(x.grad)#求解x的梯度代码:结果:Tensor张量求导机制02Autograd自动求导计算图
Autograd机制有一个计算图,可以将每个变量的计算流程以图结构表示出来,以下面计算过程为例,损失计算图可以表示为下图。
因为每个变量到损失需要经过那些运算都非常清楚,所以Autograd才能实现自主反向求导的过程。inputw2w1w3
mean
l1l2l3lossTensor张量求导机制02tensor.requires_grad()当我们创建一个张量的时候,如果没有特殊指定的话,那么这个张量是默认是不需要求导的。我们可以通过tensor.requires_grad()来检查一个张量是否需要求导。在张量间的计算过程中,如果在所有输入中,有一个输入需要求导,那么输出一定会需要求导;相反,只有当所有输入都不需要求导的时候,输出才不需要求导。a=Variable(torch.rand(3,3))#创建变量a,不设置求导b=Variable(torch.rand(3,3))#创建变量b,不设置求导c=Variable(torch.rand(3,3),requires_grad=True)#创建变量c,设置求导x=a+bprint(x.requires_grad)#查看x是否需要求导y=a+cprint(y.requires_grad)#查看y是否需要求导代码:结果:Tensor张量求导机制02在训练一个网络的时候,那么损失怎么还能自动求导呢?其实原因就是上边那条规则,虽然输入的训练数据是默认不求导的,但是,我们的model中的所有参数,它默认是求导的,这么一来,其中只要有一个需要求导,那么输出的网络结果必定也会需要求导的。注意:不要把网络的输入和GroundTruth(标注正确的数据)的requires_grad设置为True。虽然这样设置不会影响反向传播,但是需要额外计算网络的输入和GroundTruth的导数,增大了计算量和内存占用。Tensor张量求导机制02input=torch.randn(8,3,50,100)#创建一个tensorprint(input.requires_grad)#查看是否需要求导net=torch.nn.Sequential(#定义两个卷积操作,并通过函数sequential连接
torch.nn.Conv2d(3,16,3,1),torch.nn.Conv2d(16,32,3,1))output=net(input)#计算得到网络结构print(output.requires_grad)#输出结果是否需要求导代码:结果:Tensor张量求导机制02在训练的过程中冻结部分网络,让这些层的参数不可求梯度,观察输出的求导状态。这在迁移学习中很有用处。input=torch.randn(8,3,50,100)#创建一个tensorprint(input.requ
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 上饶卫生健康职业学院《蒙古语标准音训练》2023-2024学年第一学期期末试卷
- 2025年外贸英语与实务考试试卷及答案
- 山东体育学院《大数据平台技术》2023-2024学年第二学期期末试卷
- 2025年艺术设计与传媒专业考试试题及答案
- 江苏省东台市第二联盟2024-2025学年初三下学期阶段测试生物试题试卷含解析
- 宁德市福鼎市2025年三年级数学第二学期期末学业质量监测模拟试题含解析
- 2025年心理学专业硕士研究生入学试题及答案
- 晋城职业技术学院《语言学基础》2023-2024学年第一学期期末试卷
- 四川省成都市高新南区2025年第一次教学质量检测试题(合肥一模)数学试题含解析
- 四川省南部县2024-2025学年初三下学期暑假联考语文试题含解析
- 2021年四川绵竹高发投资有限公司招聘笔试试题及答案解析
- 银级考试题目p43测试题
- 有限空间作业及应急物资清单
- 思想道德与法治教案第一章:领悟人生真谛把握人生方向
- 61850报文解析-深瑞版-131016
- 0-6岁儿童随访表
- 江西新定额2017土建定额说明及解释
- 国家电网有限公司十八项电网重大反事故措施(修订版)-2018版(word文档良心出品)
- 语文四年级下册《失落的一角》绘本阅读 课件(共61张PPT)
- 余甘果的栽培与加工工艺
- 中考英语双向细目表
评论
0/150
提交评论