




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
深度学习及其典型算法应用人工智能技术应用导论010203深度学习框架简介TensorFlow深度学习框架深度学习在MNIST图像识别中的应用目录04高阶API构建和训练深度学习模型01深度学习框架简介PARTONE6.1深度学习框架简介深度学习框架社区情况Gitee社区中主流AI框架情况排
名框
架
名CommitsForkStarContributors1MindSpore38549240061007742PaddlePaddle3278819536005613OneFlow7521211264MegEngine(镜像)2280616355Jittor1239311344.1机器学习简介GitHub社区中主流AI框架情况排
名框
架
名CommitsForkStarContributors国外框架1TensorFlow1244948630016300030562PyTorch43390148005370021373Theano(StopDeveloping)28127250095003524CNTK(StopDeveloping)161164400171002015MXNet11776690019800868国内框架1MindSpore3730851427002672PaddlePaddle337534300175005243MegEngine22824624100324OneFlow76213513000995Jittor12662352300314.1机器学习简介深度学习框架比较1.TheanoTheano的开发始于2007年的蒙特利尔大学,Theano基于Python,是一个擅长处理多维数组的库,十分适合与其他深度学习库结合起来进行数据探索。它设计的初衷是为了执行深度学习中大规模神经网络算法的运算。其实,Theano可以被更好地理解为一个数学表达式的编译器:用符号式语言定义你想要的结果,该框架会对你的程序进行编译,在GPU或CPU中高效运行。Theano的出现为AI在新时代的发展打下了强大的基础,在过去的很长一段时间内,Theano都是深度学习开发与研究的行业标准。往后也有大量基于Theano的开源深度学习库被开发出来,包括Keras、Lasagne和Blocks,甚至后来火遍全球的TensorFlow也有很多与Theano类似的功能。4.1机器学习简介深度学习框架比较2.Caffe&Caffe2Caffe是一个优先考虑表达、速度和模块化来设计的框架,它由贾扬清和伯克利AI实验室研究开发,支持C、C++、Python等接口以及命令行接口。它以速度和可转性以及在卷积神经网络建模中的适用性而闻名。不过,Caffe不支持精细粒度网络层,给定体系结构,对循环网络和语言建模的总体支持相当差,必须用低级语言建立复杂的层类型,使用门槛很高。Caffe2是由Facebook组织开发的深度学习模型,虽然使用门槛不像Caffe那样高,但仍然让不那么看重性能的开发者望而却步。另外,Caffe2继承了Caffe的优点,在速度上令人印象深刻。2018年3月底,Facebook将Caffe2并入PyTorch,一度引起轰动。4.1机器学习简介深度学习框架比较3.TensorFlowTensorFlow是Google于2015年发布的深度学习框架,于2019年推出了TensorFlow2正式版本,目前2.10版本已发布。借助TensorFlow,可以轻松创建适用于桌面、移动、Web和云环境的机器学习模型。借助其灵活的架构,其可轻松地将计算工作部署到多种平台(CPU、GPU、TPU)和设备(桌面设备、服务器集群、移动设备、边缘设备等)上。目前支持Windows、MacOS、Linux系统,支持单机和分布式版本,支持多种编程语言,包括Python、C++、GO、Java、R、SWIFT、JavaScript,其中最主流的编程语言是Python。4.1机器学习简介深度学习框架比较4.KerasKeras用Python编写,可以在TensorFlow等框架之上运行。TensorFlow的接口具备挑战性,因为它是一个低级库,新用户可能会很难理解某些实现。而Keras是一个高层的API,它为快速实验而开发。因此,如果希望获得快速结果,Keras会自动处理核心任务并生成输出。深度学习的初学者经常会抱怨:无法正确理解复杂的模型。如果你是这样的用户,Keras便是你的正确选择。它的目标是最小化用户操作,并使其模型真正容易理解。目前Keras整套架构已经封装进了TensorFlow,在TF.keras上可以完成Keras的所有事情。4.1机器学习简介深度学习框架比较5.PyTorch2017年1月,FacebookAI研究院(FAIR)团队在GitHub上开源了PyTorch。PyTorch对Tensor之上的所有模块进行了重构,并新增了最先进的自动求导系统,成为当下最流行的动态图框架。PyTorch库足够简单,跟NumPy、SciPy等可以无缝连接,基于Tensor的GPU加速非常给力;基于PyTorch可以动态地设计网络。在2019年,Facebook推出PyTorchMobile框架,弥补了PyTorch在移动端的不足,使得其在商用领域的发展有望赶超TensorFlow。4.1机器学习简介深度学习框架比较6.PaddlePaddlePaddlePaddle的前身是百度于2013年自主研发的深度学习平台Paddle,且一直为百度内部工程师研发使用。PaddlePaddle,中文译名为“飞桨”。PaddlePaddle同时支持稠密参数和稀疏参数场景的超大规模深度学习并行训练,支持千亿规模参数、数百个基点的高效并行训练,也是最早提供如此强大的深度学习并行技术的深度学习框架。PaddlePaddle拥有强大的多端部署能力,支持服务器端、移动端等多种异构硬件设备的高速推理,预测性能有显著优势。PaddlePaddle已经实现了API的稳定和向后兼容,具有完善的中英双语使用文档,形成了易学易用、简洁高效的技术特色。2019年,百度还推出了多平台高性能深度学习引擎PaddleLite(PaddleMobile的升级版),为PaddlePaddle生态完善了移动端的支持。4.1机器学习简介深度学习框架比较7.Deeplearning4j(DL4J)DL4J是由来自旧金山和东京的一群开源贡献者协作开发的。2014年末,他们将其发布为Apache2.0许可证下的开源框架。2017年10月,DL4J的商业支持机构Skymind加入了Eclipse基金会,并且将DL4J贡献给开源JavaEnterpriseEdition库生态系统。DL4J是为Java和JVM编写的开源深度学习库,支持各种深度学习模型。它具有为Java和Scala语言编写的分布式深度学习库,并且内置集成了ApacheHadoop和Spark。Deeplearning4j有助于弥合使用Python语言的数据科学家和使用Java语言的企业开发人员之间的鸿沟,从而简化了在企业大数据应用程序中部署深度学习框架的操作步骤。4.1机器学习简介深度学习框架比较8.CNTK2016年1月25日,微软公司在GitHub仓库上正式开源了CNTK。根据微软开发者的描述,CNTK的性能比Caffe、Theano、TensoFlow等主流工具都要强。CNTK支持CPU和GPU模式,和TensorFlow/Theano一样,它把神经网络描述成一个计算图的结构,叶子节点代表输入或网络参数,其他节点代表计算步骤。CNTK是一个非常强大的命令行系统,可以创建神经网络预测系统。CNTK最初是出于在Microsoft内部使用的目的而开发的,导致现在用户比较少。但就框架本身的质量而言,CNTK表现得比较均衡,没有明显的短板,并且在语音领域效果比较突出。4.1机器学习简介深度学习框架比较9.MindSpore2020年3月,华为宣布全场景AI计算框架MindSpore在码云正式开源。MindSpore是一款支持端边云全场景的深度学习训练推理框架,当前主要应用于计算机视觉、自然语言处理等AI领域,旨在为数据科学家和算法工程师提供设计友好、运行高效的开发体验,提供昇腾AI处理器原生支持及软硬件协同优化。MindSpore的特性是可以显著减少训练时间和成本(开发态)、以较少的资源和最高能效比运行(运行态),同时适应包括端、边缘与云的全场景(部署态),强调了软硬件协作及全场景部署的能力。4.1机器学习简介深度学习框架比较10.MegEngineMegEngine(天元)是2020年3月正式开源的工业级深度学习框架,旷世也成为国内第一家开源AI框架的AI企业。天元可帮助开发者借助友好的编程接口,进行大规模深度学习模型的训练和部署。若说谷歌的TensorFlow采用利于部署的静态图更适用于工业界,而Facebook的PyTorch采用灵活且方便调试的动态图更适合学术科研,那么旷视的天元则在兼具了双方特性的过程中,找到了一个平衡点。天元是一个训练和推理在同一个框架、同一个体系内完整支持的人工智能模型。基于这些创新性的框架设计,天元深度学习框架拥有推理训练一体化、动静合一、兼容并包和灵活高效四大优势。4.1机器学习简介深度学习框架比较11.JittorJittor的开发团队来自清华大学计算机系图形学实验室,牵头者是清华大学计算机系胡事民教授。Jittor是国内第一个由高校开源的深度学习框架,同时也是继Theano、Caffe之后,又一个由高校主导的框架。与主流的深度学习框架TensorFlow、PyTorch不同,Jittor是一个完全基于动态编译(Just-in-time)、使用元算子和统一计算图的深度学习框架。Jittor和PyTorch的模型可以相互加载和调用。Jittor开发团队提供了实验数据。在ImageNet数据集上,使用Resnet50模型,GPU图像分类任务性能与PyTorch相比,提升32%;CPU图像分类任务提升11%。在CelebA数据集上,使用LSGAN模型,利用GPU处理图像生成任务,Jittor比PyTorch性能提升达51%。4.1机器学习简介深度学习框架比较12.OneFlowOneFlow是由北京一流科技有限公司开发的一款深度学习框架,独创四大核心技术,技术水平世界领先,已被多家互联网头部企业及研究机构应用。2020年7月31日,北京一流科技宣布其源代码全部在GitHub上开源。总的来说,各家的深度学习框架各有千秋,重要的是找到适合自己团队的,能够快速匹配团队的技术栈,快速试验以期发挥深度学习技术应用落地的商业价值。02TensorFlow深度学习框架PARTTWO6.2TensorFlow深度学习框架TensorFlow建模流程尽管TensorFlow设计上足够灵活,可以用于进行各种复杂的数值计算,但通常人们使用TensorFlow来实现机器学习模型,尤其常用于实现神经网络模型。从原理上说可以使用张量构建计算图来定义神经网络,并通过自动微分机制训练模型。但为简洁起见,一般推荐使用TensorFlow的高层次Keras接口来实现神经网络模型。使用TensorFlow实现神经网络模型的一般流程包括:准备数据、定义模型、训练模型、评估模型、使用模型、保存模型。注意,实践中的数据类型包括结构化数据、图片数据、文本数据、时间序列数据,其他深度学习框架的建模流程也是一样的6.2TensorFlow深度学习框架TensorFlow层次结构TensorFlow的层次结构如图6-1所示,从低到高可以分成5层:硬件层:TensorFlow支持CPU、GPU或TPU加入计算资源池。内核层:C++实现内核,内核可以跨平台分布运行。低阶API:为Python实现的操作符,提供了封装C++内核的低级API指令,主要包括各种张量操作算子、计算图、自动微分。中阶API:为Python实现的模型组件,对低级API进行了函数封装,主要包括各种模型层、损失函数、优化器、数据管道、特征列等。高阶API:为Python实现的模型成品,一般为按照OOP方式封装的高级API,主要为tf.keras.models提供的模型的类接口。6.2TensorFlow深度学习框架TensorFlow层次结构6.2TensorFlow深度学习框架TensorFlow层次结构可以使用低阶API,即张量操作、计算图和自动微分构建模型;也可以使用中阶API,即数据管道(tf.data)、特征列(tf.feature_column)、激活函数(tf.nn)、模型层(tf.keras.layers)、损失函数(tf.keras.losses)、评估函数(tf.keras.metrics)、优化器(tf.keras.optimizers)、回调函数(tf.keras.callbacks)构建模型;也可以使用高阶API,即tensorflow.keras.models接口构建模型。模型构建的难度由难到易。6.2TensorFlow深度学习框架TensorFlow的高阶APIKeras是一个颇受欢迎的高级API,专用于构建和训练深度学习模型。TensorFlow包括KerasAPI的完整实现(位于tf.keras模块),且此API具备针对TensorFlow的增强功能,增强功能包括:
支持EagerExecution以便进行直观调试和快速迭代。
支持TensorFlowSavedModel模型交换格式。
支持分布式训练(包括TPU上的训练),提供集成支持。高阶API可以使用3种方式构建模型:
使用SequentialAPI按层顺序构建模型。
使用FunctionalAPI构建任意结构模型。
继承Model基类构建自定义模型。6.2TensorFlow深度学习框架TensorFlow开发环境搭建下面介绍在Windows系统下搭建TensorFlow2开发环境。1.下载Anaconda开发工具Anaconda是Python的集成环境管理器和conda的包管理器,自身携带Python编译器以及众多常用库,包括scikit-learn、NumPy、SciPy、Pandas等库,它支持Windows、MacOS以及Linux系统,用于数据科学、机器学习、大数据处理和预测分析等计算科学,致力于简化包管理和部署。Anaconda官网是国外网站,直接下载速度比较慢,建议去清华大学开源软件镜像站下载,这里可以根据需要下载相应版本,如图6-2所示。6.2TensorFlow深度学习框架TensorFlow开发环境搭建6.2TensorFlow深度学习框架2.安装Anaconda双击打开后就进入到安装界面,直接按提示安装。考虑教学环境,这里使用“Anaconda3-2019”版本。如图6-3所示,安装路径不能有空格或者中文,否则在后期使用过程中可能会出现一些问题。完成了安装路径的选取后,就进入到Anaconda高级安装选项设置界面。第一个选项是把Anaconda添加到环境变量中,第二个选项是安装默认的Python版本,如图6-4所示。Anaconda自带Python,无须提前单独安装Python。6.2TensorFlow深度学习框架2.安装Anaconda6.2TensorFlow深度学习框架2.安装Anaconda继续默认安装,最后的界面如图6-5所示,单击“Finish”按钮,完成Anaconda的安装。成功安装完Anaconda后,在Windows“开始”菜单将新增一个Anaconda3文件夹,里面产生一些组件,如图6-6所示。其中,AnacondaNavigator是Anaconda可视化的管理界面,AnacondaPrompt是命令行操作conda环境的Anaconda终端,JupyterNotebook是基于Web的交互式计算笔记本环境,Spyder是Python语言的开放源代码跨平台科学运算IDE。6.2TensorFlow深度学习框架2.安装Anaconda6.2TensorFlow深度学习框架3.conda控制台打开“开始”菜单,选择Anaconda自带的命令行工具“AnacondaPrompt”,输入conda命令:conda--version,查看版本,如图6-7所示。6.2TensorFlow深度学习框架4.验证Python在控制台中输入“python”,进入Python模式,查看Python版本,如图6-8所示。6.2TensorFlow深度学习框架5.conda创建虚拟环境可以不用虚拟环境,以下初学者不用搭建。创建TensorFlow虚拟环境:condacreate-ntensorflow。进入虚拟环境:activatetensorflow。删除虚拟环境:condaenvremove-ntensorflow。6.2TensorFlow深度学习框架6.安装TensorFlow如果创建了虚拟环境,则可以进入虚拟环境,在虚拟环境中安装。初学者在控制台直接安装,无论控制台还是虚拟环境,都可以使用pip或conda两种安装方式。pip安装:使用Python的pip软件包管理器安装TensorFlow。TensorFlow2软件包需要使用高于19.0的pip版本。pipinstall--upgradepip#升级pip,或python.exe-mpipinstall--user--upgradepippipinstalltensorflow#安装TensorFlowconda安装:
condainstalltensorflow#安装TensorFlow6.2TensorFlow深度学习框架7.为Jupyter添加TensorFlow虚拟环境(省略)此部分初学者可以忽略。在虚拟环境中安装ipykernel:用于在Jupyterlab中添加内核,这里使用了清华镜像源。pipinstallipykernel-i/simple将虚拟环境添加到Jupyterlab内核:一定要进入对应的虚拟环境,然后再添加内核。python-mipykernelinstall--nametensorflow8.环境测试单击“开始”菜单选择Anaconda3文件夹里面“JupyterNotebook”,启动JupyterNotebook,控制台界面如图6-9所示。同时,系统会默认打开浏览器,如图6-10所示。6.2TensorFlow深度学习框架6.2TensorFlow深度学习框架单击右侧的“New”选项卡,从中选择“Python3”,这样就会创建了一个默认文件名为Untitled.ipynb文件,输入代码,单击运行按钮,如图6-11所示。6.2TensorFlow深度学习框架TensorFlow组成模型TensorFlow,简单看就是Tensor(张量)和Flow(流),即意味着Tensor和Flow是TensorFlow最为基础的要素,如图6-12所示。Tensor意味着data(数据),是静态的形式。Flow意味着流动,意味着计算和映射,即数据的流动、数据的计算和数据的映射,同时也体现数据是有向的流动、计算和映射,是动态的形式。TensorFlow程序=张量数据结构+计算图算法语言,张量和计算图是TensorFlow的核心概念。6.2TensorFlow深度学习框架1.TensorFlow的数据模型—张量TensorFlow所有的数据都以张量(Tensor)的形式表示,即在TensorFlow数据计算的过程中,数据流转都是采用Tensor的形式进行的。TensorFlow的数据模型是张量Tensor,张量是具有统一类型(称为dtype)的多维数组,简单来说TensorFlow内部的数据结构张量就是多维数组。就像Python数值和字符串一样,所有张量都是不可变的:永远无法更新张量的内容,只能创建新的张量。复杂的神经网络算法本质上就是各种张量相乘、相加等基本运算操作的组合。Tensor根据数据的维度可以是0阶、1阶、2阶、…、多阶。单个的数据无维度,是0阶张量。一个数组有一个维度,是1阶张量。一个矩阵有2个维度,是2阶张量。如果数据有n个维度,则就是n阶张量。如图6-13所示是一些Tensor的实例。6.2TensorFlow深度学习框架1.TensorFlow的数据模型—张量6.2TensorFlow深度学习框架1.TensorFlow的数据模型—张量Tensor有以下几个重要的属性:数据类型:即Tensor存储的数据类型,如tf.float32(32位浮点数)、tf.String(字符串)等。轴或维度:张量的一个特殊维度,轴从0标记,标量没有轴,1阶张量只有0轴,2阶张量有0轴和1轴,依次类推。维数:也称秩,张量轴数,即Tensor是几维的数据,0阶张量的维数为0,1阶张量的维数为1,2阶张量的维数为2,…,n阶张量的维数为n。形状:张量的每个轴的长度(元素数量),0阶张量的形状为[],1阶张量的形状为[D0],6.2TensorFlow深度学习框架1.TensorFlow的数据模型—张量从行为特性来看,有两种类型的张量,即常量张量和变量张量,用于区分不需要计算梯度信息的张量与需要计算梯度信息的张量。由于梯度运算会消耗大量的计算资源,而且会自动更新相关参数,对于不需要的优化的张量,如神经网络的输入X,不需要通过tf.Variable封装;相反,对于需要计算梯度并优化的张量,如神经网络层的W和b,需要通过tf.Variable包裹,以便TensorFlow跟踪相关梯度信息。利用tf.constant函数创建常量张量,tf.Variable函数创建变量张量,tf.Variable()函数可以将常量张量转换为待优化张量。不同维度数组可以用不同维度(Rank)的张量来表示。标量用0维张量表示,向量用1维张量表示,矩阵用2维张量表示。彩色图像有rgb三个通道,可以用3维张量表示。视频还有时间维,可以用4维张量表示。6.2TensorFlow深度学习框架1.TensorFlow的数据模型—张量(1)常量张量张量的数据类型和numpy.ndarray数据类型基本一一对应。代码6-1(ch6_1_constantTensor.ipynb)(2)变量张量一般将模型中需要被训练的参数设置成变量张量。代码6-3(ch6_3_variableTensor.ipynb)6.2TensorFlow深度学习框架1.TensorFlow的数据模型—张量(1)常量张量张量的数据类型和numpy.ndarray数据类型基本一一对应。【示例6-1】(ch6_1_constantTensor.ipynb)01importnumpyasnp02importtensorflowastf03i=tf.constant(1)#32类型常量04l=tf.constant(1,dtype=64)#64类型常量05f=tf.constant(1.23)#tf.float32类型常量06d=tf.constant(3.14,dtype=tf.double)#tf.double类型常量07s=tf.constant("helloworld")#tf.string类型常量08b=tf.constant(True)#tf.bool类型常量09print(64==64)10print(tf.bool==np.bool_)11print(tf.double==np.float64)12print(tf.string==np.str_)6.2TensorFlow深度学习框架【运行结果】TrueTrueTrueTrue6.2TensorFlow深度学习框架【示例6-2】代码6-2(ch6_2_Tensor_ndarray.ipynb):01importnumpyasnp02importtensorflowastf03scalar=tf.constant(1)#标量,0维张量04print(scalar)05print(tf.rank(scalar))06print(scalar.numpy().ndim)#tf.rank的作用和NumPy的ndim方法相同07tensor1d=tf.constant([1.0,2.0,3.0,4.0])#向量,1维张量,对应1维数组08print(tensor1d)09print(tf.rank(tensor1d))10print(tensor1d.numpy().ndim)#numpy方法将TensorFlow的张量转换成NumPy的数组11tensor2d=tf.constant([[1.0,2.0],[3.0,4.0]])#矩阵,2维张量,对应2维数组12print(tensor2d)13print(tf.rank(tensor2d))14print(np.ndim(tensor2d))15tensor3d=tf.constant([[[1.0,2.0],[3.0,4.0]],[[5.0,6.0],[7.0,8.0]]])#3维张量,对应3维数组16print(tensor3d)17print(tf.rank(tensor3d))18print(np.ndim(tensor3d))6.2TensorFlow深度学习框架【运行结果】tf.Tensor(1,shape=(),dtype=int32)tf.Tensor(0,shape=(),dtype=int32)0tf.Tensor([1.2.3.4.],shape=(4,),dtype=float32)tf.Tensor(1,shape=(),dtype=int32)1tf.Tensor([[1.2.][3.4.]],shape=(2,2),dtype=float32)tf.Tensor(2,shape=(),dtype=int32)2tf.Tensor([[[1.2.][3.4.]]
[[5.6.][7.8.]]],shape=(2,2,2),dtype=float32)tf.Tensor(3,shape=(),dtype=int32)36.2TensorFlow深度学习框架(2)变量张量一般将模型中需要被训练的参数设置成变量张量。【示例6-3】代码6-3(ch6_3_variableTensor.ipynb)01importnumpyasnp02importtensorflowastf03#常量张量不可以改变,只能创建新的张量。04c=tf.constant([1.0,2.0])05print(c)06print(id(c))07c=c+tf.constant([1.0,1.0])08print(c)09print(id(c))6.2TensorFlow深度学习框架10#变量张量可以改变,调用assign、assign_add等函数不会分配新张量,而会重用现有张量的内存。11v=tf.Variable([1.0,2.0])12print(v)13print(id(v))14v.assign_add([1.0,1.0])15print(v)16print(id(v))17#变量张量不执行特定运算修改此变量的值,通常也不可以改变,只能创建新的张量。18v=v+1.019print(v)20print(id(v))6.2TensorFlow深度学习框架【运行结果】tf.Tensor([1.2.],shape=(2,),dtype=float32)2081830704776tf.Tensor([2.3.],shape=(2,),dtype=float32)2081830704976<tf.Variable'v:0'shape=(2,)dtype=float32,numpy=array([1.,2.],dtype=float32)>2081575771776<tf.Variable'v:0'shape=(2,)dtype=float32,numpy=array([2.,3.],dtype=float32)>2081575771776tf.Tensor([3.4.],shape=(2,),dtype=float32)20818307051766.2TensorFlow深度学习框架1.TensorFlow的数据模型—张量(3)张量结构标量(或称“0秩”张量、“0阶”张量、“0维”张量、“0轴”张量),对应常量,没有轴。形状为[],结构如图6-14所示。向量(或称“1秩”张量、“1阶”张量、“1维”张量、“1轴”张量),对应一维数组,有1个轴。形状为[3],结构如图6-15所示。矩阵(或称“2秩”张量、“2阶”张量、“2维”张量、“2轴”张量),对应2维数组,有2个轴。形状为[3,2],结构如图6-16所示。6.2TensorFlow深度学习框架1.TensorFlow的数据模型—张量(3)张量结构6.2TensorFlow深度学习框架1.TensorFlow的数据模型—张量轴张量,形状为[3,2,5],结构如图6-17所示。6.2TensorFlow深度学习框架1.TensorFlow的数据模型—张量轴张量,形状为[3,2,4,5],结构如图6-18所示。6.2TensorFlow深度学习框架1.TensorFlow的数据模型—张量(4)张量操作张量的操作主要包括张量的结构操作和张量的数学运算,类似NumPy的数组操作,也支持向量运算和广播机制。张量结构操作有张量创建、索引切片、维度变换、合并分割。张量数学运算主要有标量运算、向量运算、矩阵运算。【示例6-4】代码6-4(ch6_4_TensorOp.ipynb):6.2TensorFlow深度学习框架代码6-4(ch6_4_TensorOp.ipynb):01importtensorflowastf02importnumpyasnp03a=tf.constant([[1,2],[3,4],])04b=tf.constant([[2,0],[0,2]])05print(a+b)06c=tf.constant([1,2,3])07d=tf.constant([[0,0,0],[1,1,1],[2,2,2]])08print(d+c)09print(a+10)10print(a@b)#等价于tf.matmul(a,b)6.2TensorFlow深度学习框架【运行结果】tf.Tensor([[32][36]],shape=(2,2),dtype=int32)tf.Tensor([[123][234][345]],shape=(3,3),dtype=int32)tf.Tensor([[1112][1314]],shape=(2,2),dtype=int32)tf.Tensor([[24][68]],shape=(2,2),dtype=int32)6.2TensorFlow深度学习框架2.TensorFlow的计算模型—三种计算图TensorFlow有三种计算图的构建方式:静态计算图、动态计算图,以及Autograph。计算图(ComputationalGraph)是由一系列边和节点组成的数据流图。每个椭圆形的节点都是一种操作,其有0个或多个Tensor作为输入边,且每个节点都会产生0个或多个Tensor作为输出边。即椭圆形的节点是将多条输入边作为操作的数据,然后通过操作产生新的数据。可以将这种操作理解为模型,或一个函数,如加、减、乘、除等操作。6.2TensorFlow深度学习框架2.TensorFlow的计算模型—三种计算图可以将计算图理解为统一建模语言(UML)的活动图,活动图和计算图都是一种动态图形。常量3.0和常量4.5两个起始Tensor通过加法(add)操作后产生了一个新Tensor(值7.5);接着新的Tensor(值7.5)和常量3.0经乘法(mult)操作后又产生了一个新Tensor(值22.5),因为22.5是TensorFlow最后产生的Tensor,所以其为终止节点。如图6-19所示。。6.2TensorFlow深度学习框架2.TensorFlow的计算模型—三种计算图(1)静态计算图在TensorFlow1.0时代,采用的是静态计算图,需要先使用TensorFlow的各种操作创建计算图,然后再开启一个会话Session,显式执行计算图。静态计算图分两步,第一步定义计算图,第二步在会话中执行计算图。TensorFlow
2.0为了确保对老版本TensorFlow项目的兼容性,在pat.v1子模块中保留了对TensorFlow
1.0那种静态计算图构建风格的支持,可称之为怀旧版静态计算图,已经不推荐使用了。【示例6-5】代码6-5(ch6_5_Session.ipynb):6.2TensorFlow深度学习框架代码6-5(ch6_5_Session.ipynb):01importtensorflowastf02#定义计算图03g=pat.v1.Graph()04withg.as_default():05node1=node3=tf.constant(3.0,tf.float32)06node2=tf.constant(4.5)07tensor1=node1+node2#等价tensor1=tf.add(node1,node2)08tensor2=tensor1*node3#等价tf.multiply(tensor1,node3)09print(node1)10print(node2)11print(node3)12#建立会话,执行计算图13withpat.v1.Session(graph=g)assess:14print(sess.run(node1))15print(sess.run(node2))16print(sess.run(node3))17print(sess.run(tensor1))18print(sess.run(tensor2))6.2TensorFlow深度学习框架【运行结果】Tensor("Const:0",shape=(),dtype=float32)Tensor("Const_1:0",shape=(),dtype=float32)Tensor("Const:0",shape=(),dtype=float32)3.04.53.07.522.56.2TensorFlow深度学习框架2.TensorFlow的计算模型—三种计算图(2)动态计算图在TensorFlow2.0时代,采用的是动态计算图,即每使用一个操作后,该操作会被动态加入到隐含的默认计算图中立即执行得到结果,而无须开启Session。动态计算图已经不区分计算图的定义和执行了,而是定义后立即执行,因此称为EagerExcution,也就是即刻执行。使用动态计算图即EagerExcution的好处是方便调试程序,它会让TensorFlow代码的表现和Python原生代码的表现一样。动态计算图的缺点是运行效率相对会低一些,因为使用动态图会有许多次Python进程和TensorFlow的C++进程之间的通信。而静态计算图构建完成之后几乎全部在TensorFlow内核上使用C++代码执行,效率更高。【示例6-6】代码6-6(ch6_6_TensorEagerOp.ipynb):6.2TensorFlow深度学习框架代码6-6(ch6_6_TensorEagerOp.ipynb):01importtensorflowastf02node1=node3=tf.constant(3.0,tf.float32)03node2=tf.constant(4.5)04tf.print(node1)05tf.print(node2)06tf.print(node3)07tensor1=node1+node208tf.print(tensor1)09tensor2=tensor1*node310tf.print(tensor2)【运行结果】34.537.522.56.2TensorFlow深度学习框架2.TensorFlow的计算模型—三种计算图(3)Autograph使用@tf.function装饰器将普通Python函数转换成和TensorFlow1.0对应的静态计算图构建静态图方式叫作Autograph。动态计算图运行效率相对较低。在TensorFlow2.0中,如果采用Autograph的方式使用静态计算图,则第一步定义计算图变成了定义函数,第二步执行计算图变成了调用函数,不需要使用会话了,因此会像原始的Python语法一样自然。实践中,我们一般会先用动态计算图调试代码,然后在需要提高性能的代码区域利用@tf.function切换成Autograph获得更高的效率。当然,@tf.function的使用需要遵循一定的规范。【示例6-7】代码6-7(ch6_7_TensorAutographOp.ipynb):6.2TensorFlow深度学习框架01importtensorflowastf02#使用autograph构建静态图03node1=node3=tf.constant(3.0,tf.float32)04node2=tf.constant(4.5)05tf.print(node1)06tf.print(node2)07tf.print(node3)08@tf.function09defmyAdd(x,y):10r=x+y11returnr12tensor1=myAdd(node1,node2)13tf.print(tensor1)14@tf.function15defmyMultiply(x,y):16r=x*y17returnr18tensor2=myMultiply(tensor1,node3)19tf.print(tensor2)6.2TensorFlow深度学习框架【运行结果】34.537.522.56.2TensorFlow深度学习框架TensorFlow实现线性回归本节通过一个实例来看看TensorFlow如何实现线性回归,示例代码如代码6-8所示。【示例6-8】代码6-8(ch6_8_LinearRegression.ipynb):01importtensorflowastf02importpandasaspd03#构建训练数据04data=pd.DataFrame({'x':[21.5188,29.6623,38.5208,46.2798,53.4075,\59.6218,64.3324,73.7624,79.5243,86.9106],'y':[1.0235,1.3757,1.6384,2.1127,2.3912,2.8319,\3.1755,3.5224,8.2856,3.8784]})05x=data['x']06y=data['y']6.2TensorFlow深度学习框架07#定义模型08model=tf.keras.models.Sequential()09model.add(tf.keras.layers.Dense(1,input_shape=(1,)))10model.summary()11#编译模型12pile(optimizer=tf.keras.optimizers.Adam(0.001),loss=tf.keras.losses.MeanSquaredError())13#训练模型14history=model.fit(x,y,epochs=1000)15#输出线性模型参数16tf.print("w=",model.layers[0].kernel)17tf.print("b=",model.layers[0].bias)18#预测结果19model.predict(x)6.2TensorFlow深度学习框架【运行结果】w=[[0.0619158521]]b=[-0.313070983][[1.0192839][1.5234956][2.0719771][2.5523822][2.9937][3.3784635][3.6701243][4.253991][4.610744][5.068073]]6.2TensorFlow深度学习框架【示例6-8续】代码6-8续(ch6_8_LinearRegression.ipynb):20frommatplotlibimportpyplotasplt21w,b=model.variables22plt.figure(figsize=(12,5))23plt.scatter(x,y,c="b",label="samples")24plt.plot(x,w[0]*x+b[0],"-r",linewidth=1.0,label="model")25plt.legend()26plt.xlabel("x1")27plt.ylabel("y",rotation=0);6.2TensorFlow深度学习框架【运行结果】运行结果如图6-20所示。6.2TensorFlow深度学习框架TensorFlow实现全连接神经网络下面通过一个简单的实例来看看TensorFlow如何实现全连接神经网络,这个例子是对逻辑与运算的真值表数据进行训练,得到相应的模型参数,用模型参数对输入值进行输出结果预测,如代码6-9所示。【示例6-9】代码6-9(ch6_9_AndOperation.ipynb):6.2TensorFlow深度学习框架01importtensorflowastf02x=[[0,0],[0,1],[1,0],[1,1]]03y=[[0],[0],[0],[1]]04model=tf.keras.Sequential([tf.keras.layers.Dense(32,activation='relu'),tf.keras.layers.Dense(16,activation='relu'),tf.keras.layers.Dense(2,activation='softmax')])05pile(optimizer=tf.keras.optimizers.Adam(0.001),loss=tf.keras.losses.SparseCategoricalCrossentropy(),metrics=[tf.keras.metrics.SparseTopKCategoricalAccuracy()])06history=model.fit(x,y,epochs=1000)07predictions=model.predict(x)08predictions09np.argmax(predictions,axis=1)6.2TensorFlow深度学习框架【运行结果】…Epoch998/10001/1[==============================]-0s12ms/step-loss:2.8888e-04-sparse_top_k_categorical_accuracy:1.0000Epoch999/10001/1[==============================]-0s9ms/step-loss:2.8679e-04-sparse_top_k_categorical_accuracy:1.0000Epoch1000/10001/1[==============================]-0s7ms/step-loss:2.8501e-04-sparse_top_k_categorical_accuracy:1.0000array([[9.9991047e-01,8.9564994e-05],
[9.9985003e-01,1.5000152e-04],
[9.9988306e-01,1.1693049e-04],
[7.7624421e-04,9.9922371e-01]],dtype=float32)array([0,0,0,1],dtype=int64)03深度学习在MNIST图像识别中的应用PARTTHREE6.3深度学习在MNIST图像识别中的应用MNIST数据集及其识别方法1.MNIST介绍MNIST手写数据识别数据集,是不同人手写0到9数字的图片集。每张图片的像素都为28×28,每个像素点用一个灰度值表示。训练集中包含60000个样本,测试集中包含10000个样本。代码6-10用于读取数据、观察数据。【示例6-10】代码6-10(ch6_10_obNumber_MNIST.ipynb):6.3深度学习在MNIST图像识别中的应用01importtensorflowastf02importmatplotlib.pyplotasplt03importnumpyasnp04fromPILimportImage05mnist=tf.keras.datasets.mnist06(x_train,y_train),(x_valid,y_valid)=mnist.load_data()07print(x_train[0].shape)08print(y_train[0])09print(x_train.shape)10print(x_valid.shape)11print(np.unique(y_train))12print(np.unique(y_valid))13plt.imshow(x_train[0].reshape((28,28)),cmap="gray");6.3深度学习在MNIST图像识别中的应用【运行结果】(28,28)5(60000,28,28)(10000,28,28)[0123456789][0123456789]6.3深度学习在MNIST图像识别中的应用MNIST数据集及其识别方法2.可视化数字图像从训练集提取图像数据并使用Matplotlib可视化,提取的数据分别是0~9数字类别的第0个位置的图像数据。【示例6-11】代码6-11(ch6_11_Number_MNIST.ipynb):6.3深度学习在MNIST图像识别中的应用01importtensorflowastf02importmatplotlib.pyplotasplt03fromPILimportImage04mnist=tf.keras.datasets.mnist05(x_train,y_train),(x_valid,y_valid)=mnist.load_data()06fig,ax=plt.subplots(nrows=2,ncols=5,sharex=True,sharey=True,)07foriinrange(2):08forjinrange(5):09img=x_train[y_train==i*5+j][0]10ax[i,j].imshow(img,cmap='Greys',interpolation='nearest')11ax[0][0].set_xticks([])12ax[0][0].set_yticks([])13plt.tight_layout()14plt.show()6.3深度学习在MNIST图像识别中的应用【运行结果】6.3深度学习在MNIST图像识别中的应用MNIST数据集及其识别方法3.可视化数字7图像代码6-12是从训练集中所有标记为数字7的图像集合中抽取前25个数据样本并转化为图像进行显示,可以观察到同一个7的不同写法。【示例6-12】代码6-12(ch6_12_NumberSeven_MNIST.ipynb):6.3深度学习在MNIST图像识别中的应用01importtensorflowastf02importmatplotlib.pyplotasplt03fromPILimportImage04mnist=tf.keras.datasets.mnist05(x_train,y_train),(x_valid,y_valid)=mnist.load_data()06fig,ax=plt.subplots(nrows=5,ncols=5,sharex=True,sharey=True,)07ax=ax.flatten()08foriinrange(25):09img=x_train[y_train==7][i].reshape(28,28)10ax[i].imshow(img,cmap='Greys',interpolation='nearest')11ax[0].set_xticks([])12ax[0].set_yticks([])13plt.tight_layout()14plt.show()6.3深度学习在MNIST图像识别中的应用【运行结果】6.3深度学习在MNIST图像识别中的应用MNIST数据集及其识别方法4.可视化类别的样本量可以看到各个类别的样本数量比较平均。【示例6-13】代码6-13(ch6_13_Numbers_Kind_MNIST.ipynb):6.3深度学习在MNIST图像识别中的应用代码6-13(ch6_13_Numbers_Kind_MNIST.ipynb):01importtensorflowastf02importmatplotlib.pyplotasplt03importseabornassns04plt.rcParams['font.sans-serif']=['SimHei']05mnist=tf.keras.datasets.mnist06(x_train,y_train),(x_valid,y_valid)=mnist.load_data()07plt.figure(figsize=(5,3))08sns.countplot(x=y_train)09plt.title("数字类别数量")10plt.show()6.3深度学习在MNIST图像识别中的应用【运行结果】6.3深度学习在MNIST图像识别中的应用MNIST数据集及其识别方法5.手写体识别的步骤将要识别的图片转为灰度图,并且转化为28×28矩阵(单通道,每个像素范围0~1,1为黑色,0为白色)。将28×28的矩阵转换成1维矩阵(也就是把第2、3、4、5……行矩阵依次接入到第一行的后面,将28×28的矩阵变为1行784列的形式)。用一个1×10的向量代表标签,也就是这个数字到底是几。例如,数字0对应的矩阵就是[1,0,0,0,0,0,0,0,0,0],数字1对应的矩阵就是[0,1,0,0,0,0,0,0,0,0]。用特定方法确定图片是哪个数字的概率。用特定方法训练参数。6.3深度学习在MNIST图像识别中的应用全连接神经网络识别MNIST图像使用全连接神经网络实现MNIST图像识别,示例代码如代码6-14所示。【示例6-14】代码6-14(ch6_14_Simple_Neural_Network.ipynb):6.3深度学习在MNIST图像识别中的应用01importtensorflowastf02importmatplotlib.pyplotasplt03importnumpyasnp04fromPILimportImage05mnist=tf.keras.datasets.mnist06(x_train,y_train),(x_valid,y_valid)=mnist.load_data()07model=tf.keras.Sequential([08tf.keras.layers.Flatten(input_shape=(28,28)),09tf.keras.layers.Dense(32,activation='relu'),10tf.keras.layers.Dense(32,activation='relu'),11tf.keras.layers.Dense(10,activation='softmax')12])13model.summary()6.3深度学习在MNIST图像识别中的应用【运行结果】Model:"sequential"_________________________________________________________________Layer(type)OutputShapeParam#=================================================================flatten(Flatten)(None,784)0
dense(Dense)(None,32)25120
dense_1(Dense)(None,32)1056
dense_2(Dense)(None,10)330
=================================================================Totalparams:26,506Trainableparams:26,506Non-trainableparams:06.3深度学习在MNIST图像识别中的应用【示例6-14续1】(ch6_14_Simple_Neural_Network.ipynb):14pile(optimizer=tf.keras.optimizers.Adam(0.001),15loss=tf.keras.losses.SparseCategoricalCrossentropy(),16metrics=[tf.keras.metrics.SparseTopKCategoricalAccuracy()])17history=model.fit(x_train,y_train,epochs=20,batch_size=64,validation_data=(x_valid,y_valid))【运行结果】…Epoch19/20938/938[==============================]-3s3ms/step-loss:0.1840-sparse_top_k_categorical_accuracy:0.9968-val_loss:0.2600-val_sparse_top_k_categorical_accuracy:0.9946Epoch20/20938/938[==============================]-3s3ms/step-loss:0.1801-sparse_top_k_categorical_accuracy:0.9968-val_loss:0.2404-val_sparse_top_k_categorical_accuracy:0.99546.3深度学习在MNIST图像识别中的应用全连接网络预测值和真实值准确率对比如下图所示。6.3深度学习在MNIST图像识别中的应用【示例6-14续3】(ch6_14_Simple_Neural_Network.ipynb):25predictions=model.predict(x_valid)26i_index=[]27foriinrange(10):28j=np.where(y_valid==i)[0][0]29i_index.append(j)30fig,ax=plt.subplots(nrows=2,ncols=5,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 玻璃风管施工方案
- 钢结构隔层施工方案
- 二零二五年度医疗纠纷责任免除合同免责任协议书
- 二零二五年度茶山茶叶种植与茶叶销售渠道租赁合同
- 二零二五年度综合性医院护士岗位招聘与服务协议
- 二零二五年度新能源开发佣金支付及可持续发展合同
- 二零二五年度橱柜行业产业园区开发合同
- 二零二五年度父债子继债权转让及清偿协议书
- 二零二五年度制造业人员派遣劳动合同
- 2025年度解除国际贸易担保合同
- 2025年福建省高职单招计算机类职业技能测试题及答案(供参考)
- 七年级历史下册 第一单元 综合测试卷(人教福建版 2025年春)
- 第3课《列夫·托尔斯泰》课件-2024-2025学年统编版语文七年级下册
- 2025年中国融通资产管理集团限公司春季招聘(511人)高频重点提升(共500题)附带答案详解
- 2025年湘教版初中地理七年级下册重点知识点梳理与归纳
- TSDLPA 0001-2024 研究型病房建设和配置标准
- 第2课《让美德照亮幸福人生》第2框《做守家庭美德的好成员》-【中职专用】《职业道德与法治》同步课堂课件
- 陕09J01 建筑用料及做法图集
- PI形式发票范文模板
- 新西兰旅行计划日行程单签证
- 水泥用大理岩储量年报
评论
0/150
提交评论