版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章
PyTorch深度学习框架目录C
O
N
T
E
N
TS4.1P
y
T
o
r
c
h框架简介4.2P
y
T
o
r
c
h环境配置与安装4.3P
y
T
o
r
c
h中的T
e
n
s
o
r4.4P
y
T
o
r
c
h常用模块及库4.5神经网络模型搭建与参数优化第4章
PyTorch深度学习框架PyTorch前身为Torch,其底层结构与Torch框架相同,但是PyTorch使用Python语言重新实现了
Torch的很多功能。PyTorch作为一个以Python为基础的深度学习框架,为搭建深度学习模型提供了极大的便利。目前很多主流深度学习模型都以PyTorch为基础,搭建PyTorch深度学习框架有助于更好地理解一些优秀的网络模型。本章主要介绍PyTorch深度学习框架的基本内容。小知识卷积神经网络(CNN)是深度学习中用于图像处理的常用网络结构。PyTorch框架简介4.14.1
PyTorch框架简介PyTorch由Torch7团队开发,是Torch的Python版本。与Torch的不同之处在于,PyTorch使用了Python作为开发语言,是由Facebook开源的神经网络框架,属于专门针对GPU加速的深度神经网络(DNN)编程。Torch是一个经典的对多维矩阵数据进行操作的张量(Tensor)库,在机器学习和其他数学密集型学习中有着广泛应用。与TensorFlow的静态计算图不同,PyTorch的计算图是动态的,可
以根据计算需要实时改变计算图。作为经典机器学习库Torch的端口,PyTorch为Python语言使用者提供了舒适的编写环境。PyTorch是一个基于Python的科学计算包,主要用于满足以下两类需求。(1)作为Num
Py的替代品,可以利用GPU的
性能进行计算。(2)要求深度学习研究平台拥有足够的灵活性和速度。4.1.1使用框架的必要性为什么不直接实现网络结构而必须使用框架呢?实际上如果有能力实现神经网络结构,完全可以自己动手实现所需的神经网络,但是这样会使工作量增大,大部分精力会花费在底层的构建而非主要模型的构建上。在当下的使用环境之中,使用框架是大势所趋,有助于节省大量底层的、烦琐的、容易出错的工作,一方面可以使用户专注于高层次的工作,另一方面又可以避免底层的一些错误。例如,在Web开发中会使用Django和SpringBoot等框架,在桌面开发中会使用MFC、QT等框架,而在深度学习领域则可以选择使用PyTorch、TensorFlow等框架。4.1
PyTorch框架简介4.1
PyTorch框架简介4.1.2主流框架对比1.TensorFlow2015年11月9日,Google正式发布并开源TensorFlow,TensorFlow是一个开源的机器学习框架,用户可以使用TensorFlow快速地构建神经网络,同时快捷地进行网络的训练、评估与保存。
TensorFlow灵活的架构可以部署在一个或多个CPU、GPU的台式机及服务器中,或在移动设备中使用单一的API应用。最初,TensorFlow是由研究人员和GoogleBrain团队针对机器学习和深度神经网络进行研究而开发的,是目前全世界使用人数最多、社区最为庞大的一个框架。TensorFlow
是由Google公司开发的,维护和更新比较频繁,并且有着Python和C++的接口,教程也非常完善。很多文献复现的第一个版本是基于TensorFlow的,TensorFlow是目前使用人群基数非常大的框架。但是由于其语言太过于底层,目前有很多基于TensorFlow的第三方抽象库将TensorFlow的函数进行封装,使其变得简洁,比较有名的包括Keras、Tflearn、tfslim及TensorLayer。4.1
PyTorch框架简介2.CaffeCaffe由贾扬清在加州大学伯克利分校攻读博士期间创建,全称是Convolutional
Architecturefor
Fast
Feature
Embedding,是一个兼具表达性、速度和思维模块化的开源深度学习框架,目前由伯克利视觉和学习中心维护。虽然Caffe是使用
C++编写的,但是它有Python和Matlab相关接口。
2017年4月,Facebook发布Caffe2,加入了递归神经网络等新功能。2018年3月底,Caffe2并入
PyTorch。3.TheanoTheano是一个较为稳定的深度学习Python库,擅长处理多维数组,属于比较底层的框架。
Theano起初是为了深度学习中神经网络算法的运算而设计的,可利用符号化语言定义想要的结果,会对程序进行编译,使程序高效运行于GPU或CPU。Theano支持自动计算函数梯度,带有Python接口并集成了NumPy,这使得它从一开始就成为了深度学习领域最常使用的库之一。但由于不支持多GPU和水平扩展,在其他优秀深度学习框架的热潮下,Theano已然开始被遗忘。目前开发Theano的研究人员大都去了Google并参与了TensorFlow的开发,可以说TensorFlow是在Theano基础上开发的。4.1
PyTorch框架简介Torch是一个有大量机器学习算法支撑的科学计算框架,其诞生已经有十年之久,但是真正起势得益于
Facebook开源了大量Torch的深度学习模块。Torch的特点是十分灵活,另外一个特殊之处是采用了编程语言
Lua。但是目前大部分深度学习算法都以Python为基
础,因此学习Lua编程语言增加了使用Torch框架的成本。而PyTorch的前身就是Torch,其底层结构和Torch框架一样,PyTorch使用Python语言重新编写了很多内容,不仅更加灵活,支持动态图,也提供了Python接口。4.Torch4.1
PyTorch框架简介小知识TensorFlow和PyTorch是常用的深度学习框架,也适用于图像处理和计算机视觉任务。5.MXNetMXNet是一个支持大多数编程语言的框架,支持7种主流编程语言,包括C++、Python、R、Scala、
Julia、Matlab和JavaScript。MXNet的优势是其开发者之一李沐是中国人,在MXNet的推广中具有语言优势(汉语),有利于国内开发者的学习。MXNet有着非常好的分布式支持形式,且性能超强,内存占用率低。但是MXNet的缺点也很明显:教程不够完善,使用者不多导致社区不大,基于MXNet的比赛和论文很少,对MXNet的推广力度不够,使得其知名度不高。4.1
PyTorch框架简介4.1
PyTorch框架简介4.1.3
PyTorch的优点PyTorch的优点如下。1.代码简洁PyTorch的设计追求最少的封装,不像TensorFlow中充斥着Session、Graph、Operation、name_scope、Variable、Tensor、Layer等全新的概念,PyTorch的设计遵循tensor—autograd—nn.Module这三个由低到高的抽象层次,分别代表张量、自动求导和神经网络(层/模块),而且这三个抽象层次之间联系紧密,可以同时进行修改和操作。简洁的设计带来的另外一个好处就是代码简洁,易于理解。PyTorch的源码只有TensorFlow的十分之一左右,更直观的设计使得PyTorch的源码十分易于阅读。4.1
PyTorch框架简介运行速度快PyTorch的灵活性不以牺牲速度为代价,在许多评测中,PyTorch的速度表现完胜TensorFlow和
Keras等框架。虽然框架的运行速度和程序员的编码水平有极大关系,但对于同样的算法,使用
PyTorch实现的框架运行速度更有可能快过其他框架实现的速度。逻辑简单易懂PyTorch是所有面向对象设计的框架中较为优雅的一个。PyTorch的接口设计思路来源于Torch,而Torch的接口设计以灵活易用而著称,Keras的作者最初就是受到了Torch的启发才成功开发了Keras。PyTorch继承了Torch的衣钵,尤其是API的设计和模块的接口都与Torch高度一致。PyTorch的设计最符合人们的思维,它让用户尽可能专注于实现自己的想法,即“所思即所得”,不需要考虑太多关于框架本身的束缚。4.1
PyTorch框架简介4.社区活跃PyTorch提供了完整的文档、循序渐进的指南及供用户交流和请教问题的论坛。Facebook人工智能研究院(Facebook
AI
Research,FAIR)对PyTorch提供了强力支持,作为当今排名第三的深度学习研究机构,FAIR的支持足以确保PyTorch获得持续的开发更新,不至于像许多由个人开发的框架一样昙花一现。4.1.4
PyTorch的架构PyTorch通过混合前端、分布式训练及工具和库这套生态系统实现快速、灵活的实验。
PyTorch和TensorFlow具有不同的计算图实现形式,TensorFlow采用静态图机制(预定义后再使用),而PyTorch采用动态图机制(运行时动态定义)。PyTorch具有以下特征。4.1
PyTorch框架简介(1)混合前端。新的混合前端在显卡加速模式下同样具有良好的兼容性和易用性,同时可以无缝转换到图形模式,以便在C++中运行时实现速度优化。(2)分布式训练。Py
Torch通过异步执行及从
Python和C++访问的对等通信,实现了性能优化。4.1
PyTorch框架简介(3)Python优先。Py
Torch是为了深入集成到Python中而构建的,因此它可以与流行的库及Cython、Numba等软件包一起使用。(4)丰富的工具和库。研究人员和开发人员建
立了丰富的工具和库生态系统,用于扩展Py
Torch并支持从计算机视觉到深度学习等领域的开发。4.1
PyTorch框架简介(5)本机开放式神经网络交换(Open
neural
networkexchange,ONNX)支持。Py
Torch以ONNX格式导出模型,以便直接访问与ONNX兼容的平台。(6)C++前端。C++前端是Py
Torch的纯C++接口,Py
Torch的前端设计和体系结构与Python相同。此接口可以提供
Py
Torch基本的数据结构和功能,如张量和自动求导,从而使C++程序可以使用Py
Torch中GPU和CPU优化的深度学习张量库。PyTorch环境配置与安装4.24.2
PyTorch环境配置与安装PyTorch目前支持Linux、macOS和Windows三种操作系统,并支持多种安装方式。PyTorch官网上给出了Conda、
Pip、LibTorch、Source几种不同的安装方式,以及基于
Python、C++/Java等不同语言进行的安装。Anaconda是配置深度学习环境所必要的软件,提供了包管理与环境管理的功能,可以很方便地解决Python版本并存、切换及各种第三方包安装的问题,关于Anaconda的安装已在本书第一章中
进行了介绍,此处不再赘述。小知识TensorFlow和PyTorch是常用的深度学习框架,也适用于图像处理和计算机视觉任务。4.2
PyTorch环境配置与安装PyTorch有多种安装方式,这里介绍Pip安装及Conda安装两种安装方式。小知识安装Python机器视觉相关模块时,可以将pip的安装源更换为国内站点,以提高安装速度。1.Pip安装首先进入PyTorch官网(/),根据计算机系统配置选择相应PyTorch版本,如图4-1所示。4.2
PyTorch环境配置与安装根据计算机环境选择相应版本进行安装。这里选择操作系统为“Windows”,选择“Package”为“Pip”,选择“Language”为“Python”,选择“ComputePlatform”为“CUDA10.2”(当有英伟达GPU且已经安装CUDA时选择CUDA,没有GPU或未安装CUDA时选择CPU,使用GPU可以大幅度加快训练速度,安装时要注意计算机显卡、CUDA、PyTorch三者的版本对应关系)。选择完之后,复制“Runthis
Command”中给出的代码“pip3
install
torch==1.9.1+cu102
torchvision==0.10.1+cu102
torchaudio===0.9.1-f/whl/torch_stable.html”,将代码粘到命令提示符窗口后按“Enter”键运行,如图4-2所示。4.2
PyTorch环境配置与安装4.2
PyTorch环境配置与安装2.Conda安装使用Conda安装方式类似于使用Pip安装方式,首先需要进入PyTorch官网(/),然后根据计算机系统配置选择相应PyTorch版本,如图4-3所示。4.2
PyTorch环境配置与安装4.2
PyTorch环境配置与安装4.2
PyTorch环境配置与安装安装完毕后,验证PyTorch是否安装成功。打开Anaconda的Jupyter
Notebook,执行“New”→“Python3”命令,新建Python文件,运行demo,如图4-5所示。4.2
PyTorch环境配置与安装输入图4-6所示的In[1]、In[2]、In[3]、In[5]的代码,进行测试,最后打印出Tensor,说明安装成功。4.2
PyTorch环境配置与安装PyTorch中的
Tensor4.34.3
PyTorch中的
TensorTensor(张量)是一个多维数组,它是标量、向量、矩阵的高维拓展。标量是一个零维张量,没有方向,是一个数。一维张量只有一个维度,只有一行或一列。二维张量是一个矩阵,有两个维度,灰度图片就是一个二维张量。当图像为彩色图像(RGB)时,就得使用三维张量了。不同维度的Tensor如图4-7所示。4.3.1
Tensor的创建Tensor是PyTorch中基本的数据单元,下面主要介绍3种创建Tensor的方式。直接创建可以用代码torch.tensor(data,dtype=None,device=None,requires_grad=False)直接创建Tensor。此代码中各变量解释如下。data:可以是list、tuple、numpyarray、scalar或其他类型。
(2)dtype:可以返回想要的Tensor类型。(3)device:可以指定返回的设备。
(4)requires_grad:是否进行参数跟踪,默认为False。4.3
PyTorch中的
Tensor使用此代码直接创建Tensor的示例如下:4.3
PyTorch中的
Tensor2.从NumPy中获得数据可以使用代码torch.from_numpy(ndarry)从NumPy中获得数据,并创建Tensor。需要注意的是,使用此代码生成的Tensor会与ndarry共享数据,任何对Tensor的操作都会影响到ndarry;反之亦然。代码的具体使用如下:4.3
PyTorch中的
Tensor4.3
PyTorch中的
Tensor创建特定的Tensor创建特定的Tensor是指直接通过PyTorch代码指定Tensor的格式,因为需求多样化,创建特定Tensor的代码也相对较多,下面将其汇总为三类进行介绍。根据数值要求创建Tensor的代码解释4.3
PyTorch中的
Tensor4.3
PyTorch中的
Tensor4.3
PyTorch中的
Tensor2)根据矩阵要求创建Tensor的代码解释4.3
PyTorch中的
Tensor3)随机生成Tensor的代码解释4.3
PyTorch中的
Tensor4.3
PyTorch中的
Tensor4.3.2
Tensor的基本操作Tensor作为PyTorch中基本的数据单元,具有组合、分块、索引、变换等一系列运算操作。下面通过一些基本的函数来对这些操作进行介绍。1.组合操作组合操作是将不同的Tensor叠加起来,主要有torch.cat和torch.stack两个函数。4.3
PyTorch中的
Tensor作用:沿着dim连接seq中的Tensor,所有的Tensor必须有相同的维度,其相反的操作为torch.split()和torch.chunk()。作用:与torch.cat()作用类似,但是注意torch.cat和torch.stack的区别在于,torch.cat会增加现有维度的值,可以理解为续接,torch.stack会增加一个维度,可以理解为叠加。4.3
PyTorch中的
Tensor组合操作函数的使用示例代码如下:4.3
PyTorch中的
Tensor2.分块操作分块操作是与组合操作相反的操作,分块操作将Tensor分割成不同的子Tensor,主要有torch.split()与torch.chunk()两个函数。作用:将输入张量分割成相等形状的子张量。如果沿指定维度的张量不能被split_size整分,则最后一个分块会小于其他分块。4.3
PyTorch中的
Tensor作用:将Tensor拆分成相应的分块,torch.split和torch.chunks的区别在于,torch.split的split_size表示每一个分块中数据的大小,torch.chunks的chunks表示分块的数量。分块操作函数的使用示例代码如下:4.3
PyTorch中的
Tensor3.索引操作在PyTorch中,通过索引操作可以返回Tensor中的一部分数据,下面主要通过torch.index_select()和torch.masked_select两个函数来对索引操作进行介绍。作用:返回沿着dim的指定Tensor,其中,index须为longTensor类型。作用:返回input中mask为True的元素,组成一个一维的Tensor,其中,mask须为ByteTensor类型。4.3
PyTorch中的
Tensor索引操作函数的使用示例代码如下:4.3
PyTorch中的
Tensor4.变换操作在使用PyTorch处理问题时,有时需要改变张量的维度,以便后期进行其他计算和处理。下面通过介绍部分常用的变换函数来对张量的变换操作进行介绍。作用:返回dim0和dim1交换后的Tensor。作用:对维度进行压缩。当不指定dim时,仅删除input中大小为1的维度。当给定dim时,只在给定的维度上进行压缩操作。4.3
PyTorch中的
Tensor作用:与torch.squeeze()功能相反,在输入维度的指定位置插入维度1,如A×B变为1×A×B。作用:返回size为shape且与输入张量具有相同数值的Tensor,注意shape=-1这种表述,-1表示输出的size是任意的。4.3
PyTorch中的
Tensor作用:将输入Tensor从dim进行切片,并返回切片的结果,返回的结果里面没有dim这个维度。作用:返回输入张量中非零值的索引,每一行都是一个非零值的索引值。4.3
PyTorch中的
Tensor变换操作函数的使用示例代码如下:4.3
PyTorch中的
Tensor4.3
PyTorch中的
TensorPyTorch常用模块及库4.44.4
PyTorch常用模块及库4.4.1
torch.autograd模块PyTorch作为一个深度学习框架,在深度学习任务中比NumPy更有优越性,主要体现在两个方面:一是PyTorch提供了自动求导(autograd)模块;二是PyTorch支持GPU加速。自动求导是PyTorch的重要组成部分。autograd包是PyTorch中所有神经网络的核心。PyTorch的autograd模块主要是对深度学习算法中的反向传播过程求导数。在张量上进行的所有操作,autograd模块都能对张量自动进行微分,简化了手动计算导数的复杂过程。张量在数学中是多维数组,在PyTorch中,张量不仅表示多维数组,还是PyTorch中自动求导的关键。在PyTorch0.4.0以前的版本中,PyTorch使用Variable自动计算所有的梯度。从PyTorch0.4.0起,
Variable正式合并到Tensor中,通过Variable实现的自动微分功能也整合进入了Tensor中。虽然为了兼容性目前还是可以使用Variable(Tensor)这种方式进行嵌套,但是这个操作已经无法实现原有的功能了。后续的代码建议直接使用Tensor进行操作,因为官方文档已经将Variable设置成过期模块。Tensor本身就支持使用autograd功能,在函数中设置requires_grad=True即可。4.4
PyTorch常用模块及库如图4-8所示,Variable主要由5个部分组成。torch.autograd.Variable参数说明如下。4.4
PyTorch常用模块及库(1)data:表示被封装的Tensor。1(4)requires_grad:表示是否进行参数跟踪,默认为False。4(2)grad:表示data的梯度。2(5)is_leaf:表示是否是叶子节点(张量)。5(3)grad_fn:表示创建Tensor的function,是自动求导的关键。3自PyTorch0.4.0版本后,Variable已并入Tensor中。Tensor主要由8个部分组成,如图4-9所示。4.4
PyTorch常用模块及库4.4
PyTorch常用模块及库torch.Tensor参数说明如下。(1)data:可以是list、tuple、numpyarray、scalar或其他类型。(3)shape:表示张量的形状,如
(64,3,224,224)(2)dtype:可以返回想要的Tensor类型。(4)device:可以指定返回的设备。4.4
PyTorch常用模块及库(5)requires_grad:表示是否进行参数跟踪,默认为False。(7)grad_fn:表示创建Tensor的function,是自动求导的关键。(6)grad:表示data的梯度。(8)is_leaf:表示是否是叶子节点(张量)。使用下述代码可以进行自动求导:4.4
PyTorch常用模块及库4.4
PyTorch常用模块及库4.4
PyTorch常用模块及库4.4.2
torch.nn模块autograd模块虽然可以构建深度学习模型,但其代码编写量大,增加了编程人员的编写难度。在这种情况下,torch.nn便应运而生,torch.nn是PyTorch中专门用来构建神经网络模型的模块。
torch.nn提供了很多与实现神经网络中的具体功能相关的类,这些类涵盖了深度神经网络模型在搭建和参数优化过程中的常用内容。torch.nn的核心数据结构是Module,这是一个抽象概念,既可以表示神经网络中的某个层,例如,卷积层、池化层和全连接层等常用层,也可以表示含多个层的神经网络。4.4
PyTorch常用模块及库小知识OpenCV的Python接口非常友好,可以轻松实现图像和视频处理的任务。当使用PyTorch来搭建神经网络时,使用的主要工具都存放在torch.nn模块中。torch.nn依赖
autograd来定义模型,搭建于autograd之上,可用来定义和运行网络模型,并对其进行自动求导。torch.nn模块内包含搭建神经网络需要用到的一系列模块和loss函数,包括全连接、卷积、批量归一化、dropout、CrossEntryLoss、MSELoss等。torch.nn可以使代码变得更加简洁。4.4
PyTorch常用模块及库1.torch.nn的构成下面主要介绍torch.nn中的nn.Parameter、nn.Module及nn.functional这3个经常用到的类。(1)nn.Parameter:主要继承自torch.Tensor的子类,作为nn.Module中的可训练参数来使用。它与torch.Tensor的区别是,nn.Parameter会被自动认为是Module的可训练参数,会被加入Parameter迭代器中;而Module中的普通Tensor并不位于Parameter中。(2)nn.Module:nn.Module是torch.nn中十分重要的类,包含网络各层的定义及前向传播的各种方法,是PyTorch体系下所有神经网络模块的基类。4.4
PyTorch常用模块及库(3)nn.functional:torch.nn中的大多数层在functional中都有一个与之对应的函数。其使用情况与nn.Module类似,但是也存在一定的区别。当模型中有可学习的参数时,最好使用nn.Module,否则,既可以使用nn.functional,也可以使用nn.Module,两者在性能上没有太大差异,具体的使用方式取决于个人喜好。由于激
活函数(ReLu函数、sigmoid函数、Tanh函数)、池化(MaxPool)等层没有可学习的参数,因此可以使用对应的functional函数。而对于卷积、全连接等有可学习参数的网络,则建议使用nn.Module。4.4
PyTorch常用模块及库4.4
PyTorch常用模块及库2.神经网络模型搭建的典型流程在上文中已经提到,torch.nn模块的出现主要是为了搭建神经网络模型,其内部含有很多搭建神经网络模型的子类,在后面章节中将从分类、检测、分割等领域来详细介绍如何建立深度学习神经网络,总地来说,搭建深度学习神经网络模型可以分为以下6步。4.4
PyTorch常用模块及库(1)定义一个拥有可学习参数的神经网络。(4)计算损失值。(2)遍历训练数据集。(5)将网络参数的梯度进行反向传播。(3)处理输入数据使其流经神经网络。(6)更新网络的权重。4.4
PyTorch常用模块及库torch.nn常用函数介绍构建神经网络常用的函数包括卷积函数和池化函数,池化函数又可细分为平均池化函数和最大池化函数,它们可以起到不同的池化效果。卷积函数卷积函数的格式如下:功能:常用于二维图像,对输入数据进行特征提取。参数说明如下。4.4
PyTorch常用模块及库(2)out_channels:表示卷积输出的通道。(1)in_channels:表示输入信号的通道。(3)kernel_size:表示卷积核的尺寸。(4)stride:表示卷积步距,默认为1。4.4
PyTorch常用模块及库(6)dilation:表示卷积核元素之间的距离,默认为1。(5)padding:表示输入的每一条边填充的层数,默认为0。(7)groups:表示从输入通道到输出通道的阻塞连接数,默认为1。(8)bias:表示是否要添加偏置参数作为可学习参数之一。4.4
PyTorch常用模块及库2)最大池化函数最大池化函数的格式如下:功能:对二维信号(图像)进行最大池化,对邻域内特征点的特征值仅取最大值,能够很好地保留纹理特征。最大池化也称为欠采样或下采样,主要用于特征降维、压缩数据和参数的数量、减小过拟合,同时提高模型的容错性及网络模型的运算速度。4.4
PyTorch常用模块及库(1)kernel_size:表示池化核尺寸。(4)dilation:表示池化核间隔大小。(2)stride:表示步距。(5)return_indices:表示记录池化像素索引。(3)padding:表示填充个数。(6)ceil_mode:表示尺寸向上取整。参数说明如下。4.4
PyTorch常用模块及库3)平均池化函数平均池化函数的格式如下:功能:对二维信号(图像)进行平均池化,对邻域内特征点的特征值求平均,能够很好地保留背景,但是容易使数据变得模糊。平均池化与最大池化一样,也称为欠采样或下采样,主要用于特征降维、压缩数据和参数的数量、减小过拟合,同时提高模型的容错性及网络模型的运算速度。这点与最大池化是一样的。4.4
PyTorch常用模块及库(1)kernel_size:表示池化核尺寸。(3)padding:表示填充个数。(2)stride:表示步距。(5)count_include_pad:表示用于计算的填充
值。(3)padding:表示填充个数。(6)divisor_override:表示除法因子。参数说明如下。4.4
PyTorch常用模块及库4.4.3
torch.optim模块在构建神经网络时需要使用一些模块来实现权重参数的自动优化及更新,torch.optim模块提供了非常多的可实现参数自动优化的类,如SGD、AdaGrad、RMSprop、Adam等,这些类在PyTorch中用于优化模型的参数。小知识物体识别是在检测到物体后,对其进行分类和识别的过程,常用的分类器有SVM、神经网络等。1.构建优化器为了使用torch.optim模块,须先构造一个优化器对象Optimizer用来保存当前的参数,并能根据梯度信息实时更新参数。优化器主要是在模型训练阶段对模型的可学习参数进行更新,常用优化器如前文提到的SGD、RMSprop、Adam等。优化器初始化时需要给模型传入可学习参数及其他超参数,如lr、momentum等。在训练过程中需要先调用optimizer.zero_grad()函数清空梯度,再调用loss.backward()函数反向传播,最后调用optimizer.step()函数更新模型参数。4.4
PyTorch常用模块及库2.优化步骤前文提到,所有优化器optimizer都调用step()函数对所有的参数进行更新,主要有两种调用方法。1)利用optimizer.step()函数进行调用这是大多数优化器都支持的简化版本,使用loss.backward()方法计算梯度时会使用此函数,具体代码如下:4.4
PyTorch常用模块及库2)利用optimizer.step(closure)函数进行调用一些优化算法(如共轭梯度和LBFGS优化器)需要多次重新评估目标函数,所以必须传递一个closure重新计算模型参数。需要用到closure清除梯度,计算并返回损失,具体代码如下:4.4
PyTorch常用模块及库4.4.4
torchvision库torchvision服务于PyTorch深度学习框架,用来生成图片、视频数据集和一些流行的预训练模型。torchvision是一个专门用来处理图像的库,主要用来构建计算机视觉模型。torchvision主要包含以下4个部分。torchvision.datasets:提供一些加载数据的函数及常用数据集接口。可以从主流的视觉数据集中加载数据。torchvision.models:提供很多已经训练好的深度学习网络模型,如AlexNet、VGG、ResNet及预训练模型等。torchvision.transforms:提供丰富的类,可以对载入的数据进行变换操作。
(4)torchvision.utils:提供一些常用工具包。上述前3类函数常用于计算机视觉模型,本节主要介绍这3类函数。4.4
PyTorch常用模块及库4.4
PyTorch常用模块及库torchvision.datasetstorchvision.datasets的主要作用是进行数据加载。PyTorch团队在torchvision.datasets包中已提前处理了大量图片数据集,并提供了一些针对数据集的参数设置,因而可以通过一些简单的参数设置完成数据集的调用。MNISTCOCO、Captions、Detection、LSUN、ImageFolder、Imagenet-12、CIFAR、STL10、SVHN、PhotoTour等数据集都可以通过此方法进行直接调用。torchvision.modelstorchvision.models的主要作用是提供已经训练好的网络模型,方便加载之后直接使用。AlexNet、DenseNet、Inception、ResNet、SqueezeNet、VGG等常用网络模型都可以通过此方法调用。可以通过两种方式创建网络模型:一种是直接创建一个初始参数随机的网络模型;另一种是使用pretrained=True加载其他已经训练好的模型。创建网络模型的具体方式如下。方式一:创建一个初始参数随机的模型,具体代码如下:4.4
PyTorch常用模块及库方式二:创建一个带有预训练权重的模型(设置pretrained=True即可),具体代码如下:4.4
PyTorch常用模块及库3.torchvision.transformstorchvision.transforms是PyTorch中的图像处理包,包含了多种对图像数据进行变换的函数。在读入图像数据时要经常用到这些函数,当输入数据集中图片的格式或大小不统一时,需要进行归一化或缩放等操作。当输入数据集中的图片数量太少时,也需要一些针对图片的操作进行数据增强。torchvision.transforms有助于很好地完成以上操作。可以将torchvision.transforms中常见的函数分为四大类,分别是裁剪、翻转和旋转、图像变换及针对transforms本身的操作。下面按类别对一些主要函数进行介绍。4.4
PyTorch常用模块及库1)裁剪裁剪操作函数主要包括以下方面。4.4
PyTorch常用模块及库(1)中心裁剪:
transforms.CenterCrop()。1(4)上下左右中心裁剪:
transforms.FiveCrop()。4(2)随机裁剪:
transforms.RandomCrop()。2(5)上下左右中心裁剪后翻转:
transforms.TenCrop()。5(3)随机长宽比裁剪:
transforms.RandomResizedCrop()。32)翻转和旋转翻转和旋转操作函数主要包括以下方面。4.4
PyTorch常用模块及库(
1
)按照概率p水平翻转:transforms.Random
Horizontal
Flip(p=0.5)(这里p=0.5)。(
2
)按照概率p垂直翻转:transforms.Random
Vertical
Flip(p=0.5)(这里p=0.5)。(
3
)随机旋转:transforms.Random
Rotation()3)图像变换图像变换操作函数主要包括以下方面。4.4
PyTorch常用模块及库(1)标准化:transforms.Normalize()。1(4)修改亮度、对比度和饱和度:
transforms.ColorJitter()。4(2)将载入的数据转换为Tensor数据类型的变量:transforms.ToTensor()。2(5)转灰度图:
transforms.Grayscale()。5(3)填充:transforms.Pad。34.4
PyTorch常用模块及库(6)线性变换:
transforms.LinearTransformation()。6(9)将载入数据转换为PILImage:transforms.ToPILImage()。9(7)仿射变换:
transforms.RandomAffine()。7(10)将lambda应用作为变换:transforms.Lambda()。10(8)将载入数据转换为灰度图:
transforms.RandomGrayscale()。84)针对transforms本身的操作针对transforms本身的操作函数主要包括以下方面。4.4
PyTorch常用模块及库(
1
)从给定的一系列transforms中选一个进行操作:transforms.Random
Choice()。(
2
)给一个transforms加上概率,依概率进行操作:transforms.Random
Apply()。(
3
)将transforms中的操作随机打乱:transforms.Random
Order()。神经网络模型搭建与参数优化4.54.5
神经网络模型搭建与参数优化下面使用已经掌握的知识,以简单、快捷的方式搭建一个基于PyTorch框架的神经网络模型,同时让模型参数的优化方法趋于高效。搭建神经网络模型的具体代码如下,这里会将完整的代码分成几部分进行详细介绍,以便于读者理解。代码的开始处是相关包的导入:先通过import导入必要的包。例如,导入torch.autograd包来完成网络自动梯度过程,然后定义4个整型变量,其中,batch_n是在一个批次中输入数据的数量,值是100,这意味着在一个批次中输入100个数据,同时,每个数据包含的数据特征有input_data个,即每个数据的数据特征就是1000个;
hidden_layer用于定义经过隐藏层后保留的数据特征的个数,这里有100个,因为模型只考虑一层隐藏层,所以在代码中仅定义了一个隐藏层的参数;output_data是输出的数据,值是10,可以将输出的数据看作一个分类结果值的数量,数字10表示最后要得到10个分类结果值。一个批次的数据从输入到输出的完整过程:先输入100个具有1000个特征的数据,经过隐藏层的线性变换和激活函数后变成100个具有100个特征的数据,再经过输出层后输出100个具有10个分类结果值的数据,在得到输出结果之后计算损失并进行反向传播,这样一次模型的训练就完成了,然后循环这个流程就可以完成指定次数的训练,并达到优化模型参数的目的,如图4-10所示。4.5
神经网络模型搭建与参数优化4.5
神经网络模型搭建与参数优化下面看看如何完成从输入层到隐藏层、从隐藏层到输出层的权重初始化定义工作,这里仅定义了输入和输出的x和y变量,这与下面在代码中使用的torch.nn包中的类有关,这些类能够帮助人们自动生成和初始化对应维度的权重参数,而不需要自己另外定义权重参数。具体代码如下:4.5
神经网络模型搭建与参数优化torch.nn.Sequential括号内的内容就是搭建的神经网络模型的具体结构,这里首先通
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026二上数学第五单元新课标课件
- 财务科主任述职报告(3篇)
- 2026北师大二下买电器新课标课件
- 我们怎样学习地理练习题说课材料
- 液体压强的计算
- 2026北师大二下奥运开幕情境课件
- 新苏教版科学五年级上册5-20.《我们来仿生》课件
- 2026北师大二下小蝌蚪成长游戏课件
- 新苏教版科学五年级上册 3.11《浮力》教学课件
- 2026四下数学小数的意义性质教学课件
- DB15-T 4502-2026 非物质文化遗产档案管理规范
- 【新教材】2026秋人教PEP版六年级上册英语Unit 2 Getting together 教案(3课时)
- 新版2026年高考数学真题(上海秋考)解析版合集
- 2026年新疆中考语文(真题)试卷(含答案)
- 智慧医疗分级评价方法及标准(2025版 官方完整版)
- 水稻项目可行性研究报告
- 2026年公开选拔镇副科级领导干部笔试试题含答案
- T-CEMA 047-2025 藏医头浴疗法技术操作规范
- 小学三年级英语一般现在时用法及习题
- 京东七鲜自有品牌运营
- 光伏电站现场工作管理流程
评论
0/150
提交评论