MXNet深度学习实战(txt+pdf+epub+mobi电子书下载)


发布时间:2020-07-08 22:18:32

点击下载

作者:魏凯峰

出版社:机械工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

MXNet深度学习实战

MXNet深度学习实战试读:

前言

为什么要写这本书

深度学习领域开始受到越来越多的关注,各大深度学习框架也孕育而生,在这个阶段,我被深度学习深深吸引并逐渐开始学习相关知识。研究生毕业后,我继续从事算法相关的工作,具体而言是深度学习算法在图像领域的应用,也就是常说的计算机视觉算法。

MXNet和PyTorch这两个框架我都非常喜欢,不过目前市面上关于MXNet框架的书籍较少,而且MXNet发展至今各种接口比较稳定,用户体验挺不错的,所以最终决定以MXNet框架来写这本深度学习实战教程。MXNet是亚马逊官方维护的深度学习框架,在灵活性和高效性方面都做得很棒,非常推荐读者学习。

本书的写作难度比想象中要大许多,在写作过程中许多零散的知识点需要想办法串联起来,让不同知识储备的人都能看懂,许多环境依赖需要从头到尾跑一遍来确认清楚。写书和写博客(AI之路)最大的区别在于书籍在出版后修正比较麻烦,不像博客,随时发现错误都可以修改,因此在写作过程中对许多细节和措辞都推敲了很久,自己也从中学到了许多。

读者对象

随着深度学习的快速发展和相关学习资料的出版,深度学习入门门槛越来越低,竞争也越来越激烈,相关从业者不仅要有坚实的算法基础,更要具备一定的实战经验,相信本书能够帮助你更好地入门深度学习。

本书面向的读者为:·计算机视觉算法从业者或爱好者·准备入门深度学习的读者·使用MXNet框架进行算法实现的读者

本书特色

假如一本书只是单纯介绍算法内容,那其实和直接看论文没有太大区别;假如一本书只是单纯介绍框架接口,那其实和直接看接口文档没有太大区别。在笔者看来,算法是思想,框架是工具,用框架实现算法才能体现算法的价值,因此这本书将算法和框架结合起来,通过讲解算法和个人项目经验介绍如何使用MXNet框架实现算法,希望能够帮助读者领略算法之美。

本书是从一名算法工程师的角度出发介绍算法实现,整体上偏基础和细节,能够帮助入门者少走弯路。随着这几年深度学习的快速发展,众多深度学习框架对各类接口的封装都很完善,使用起来非常方便,但是部分深度学习入门者仅仅停留在跑通demo却不理解细节内容的层面,这也常常被人调侃有些浮躁,通过本书,笔者希望读者不仅能够灵活调用这些接口实现算法,而且能够理解这些接口的内在含义,不断夯实自己的算法基础。

如何阅读本书

本书分为四大部分:

第一部分为准备篇(第1~2章),简单介绍深度学习相关的基础背景知识、深度学习框架MXNet的发展过程和优缺点,同时介绍基础开发环境的构建和docker的使用,帮助读者构建必要的基础知识背景。

第二部分为基础篇(第3~7章),介绍MXNet的几个主要模块,介绍MXNet的数据读取、数据增强操作,同时介绍了常用网络层的含义及使用方法、常见网络结构的设计思想,以及介绍模型训练相关的参数配置。

第三部分为实战篇(第8~10章),以图像分类、目标检测和图像分割这三个常用领域为例介绍如何通过MXNet实现算法训练和模型测试,同时还将结合MXNet的接口详细介绍算法细节内容。

第四部分为扩展篇(第11~12章),主要介绍Gluon和GluonCV。Gluon接口是MXNet推出的用于动态构建网络结构的重要接口,GluonCV则是一个专门为计算机视觉任务服务的深度学习库。

本书按照由浅至深的顺序进行编写,如果你是一名初学者,那么建议从第1章的基础理论知识开始学习,如果你是一名经验丰富的资深用户,能够理解MXNet的相关基础知识和使用技巧,那么你可以直接阅读实战部分的内容。

勘误和支持

由于作者的水平有限,编写时间仓促,书中难免会出现一些错误或者不准确的地方,恳请读者批评指正。本书所有代码都可以从https://github.com/miraclewkf/MXNet-Deep-Learning-in-Action下载,同时如果你遇到任何问题,都可以在Issues界面提出,我将尽量在线上为读者提供最满意的解答,后期发现的错误也将在该项目中注明,欢迎读者关注。如果你有更多的宝贵意见,也欢迎发送邮件至邮箱wkf8092@163.com,期待能够得到你们的真挚反馈。

致谢

首先要感谢MXNet的开发者们,是你们创造并一直维护这个高效便捷的深度学习框架,让众多深度学习爱好者能够通过MXNet享受算法带来的乐趣。

感谢MXNet社区中每一位为MXNet的发展和推广做出贡献的朋友,是你们带领我走进MXNet并逐渐喜欢上它,你们的活力与坚持将使得MXNet的明天更加美好。

感谢机械工业出版社华章公司的杨福川老师、李良老师和张锡鹏老师,在这一年多的时间中始终支持我的写作,你们的鼓励和帮助引导我顺利完成全部书稿。

感谢那些通过华章鲜读购买和阅读早期电子版书籍的读者们,你们的支持让我更加有动力不断完善这本书的内容,也让我更加确信自己在做一件非常有意义的事情。

最后感谢我的家人将我培养成人,你们永远是我最坚实的后盾!

谨以此书献给众多热爱深度学习算法及MXNet的朋友们!

魏凯峰第1章全面认识MXNet

人工智能在最近几年非常火热,许多名词不断出现在我们的生活中,比如人工智能、机器学习、大数据、深度学习等。这些名词对大众而言既陌生又熟悉,陌生是因为大部分人其实并不从事相关行业,因此这些名词往往与大众之间隔着一层神秘的面纱;熟悉是因为大部分人在生活中其实正在享受这些名词背后的技术和产品所带来的服务。实际上,很多技术并不是刚刚出现,只不过最近几年,硬件资源和算法的快速迭代,推动了许多技术的发展和产品的落地,使得越来越多的人在生活中接触到人工智能相关的产品。

人工智能相关技术的发展使得我们目前的生活更加智能化,举个例子,目前有很多家公司都在深耕人脸检测和识别技术,该技术既可以用在手机屏幕解锁,又可以用在机场、小区等场景做人脸比对,还可以用人脸识别技术辅助公安部门抓捕逃犯。另一个例子是手机的实时翻译,当你身处异国他乡,语言沟通不畅时,只需要对着手机讲中文,然后实时翻译算法自动将你说的话翻译成对应的语言并播放出来,相信这一定会让你的沟通畅通无阻。综上所述,人工智能相关技术的应用可以节约大量的人力成本,提高效率,同时解决生活中的诸多难题,这也是为什么最近几年人工智能相关技术如此火热。

随着人工智能相关技术在各行各业的不断渗透,学习和使用人工智能相关技术成为了很多人的选择。本书将以深度学习技术在图像领域的应用为切入点,并通过详细的代码例程和算法基础介绍,带领大家了解并使用深度学习框架MXNet训练深度学习模型,以达到解决实际问题的目的。本章将首先为大家揭开人工智能、机器学习、深度学习、深度学习框架MXNet的神秘面纱,让大家建立起对这些知识的认识,为后续的学习打下坚实的基础。1.1 人工智能、机器学习与深度学习

人工智能、机器学习和深度学习这三个名词作为最近几年工业界和学术界的宠儿,在我们生活中扮演了非常重要的角色。简单来讲,这三者基本上是从宏观到微观的关系,也就是说人工智能的范围是最广的,机器学习可以看作是人工智能中的一部分,而深度学习可以看作是机器学习的一部分。这样的定义也许并不是十分严谨,但这并不会影响你对这三者的认识。另外还有一个名词也经常出现在我们的生活中,那就是大数据。其实这里提到的人工智能、机器学习和深度学习都离不开大数据的支撑,在今后的学习中你会发现,正是因为越来越多的数据得到了利用,深度学习技术才能不断发挥其“神秘”的作用。1.1.1 人工智能

人工智能涉及的概念和技术非常广泛,而且其与传统技术之间没有特别明显的界限,所以很难对人工智能相关技术做一个限定,但是提到人工智能,就不得不提图灵测试。图灵测试是由人工智能之父艾伦·麦席森·图灵(Alan Mathison Turing)提出的一个关于检验机器是否具备人类智能的测试。该实验的内容是测试者和被测试者(一个人和一台机器)在分开的前提下,由测试者通过一定的装置(比如键盘)向被测试者发问,经过多次测试之后,如果有超过30%的测试者不能判断出被测试者是人还是机器,那么这台机器就通过了图灵测试。

目前,我们所实现的人工智能还不能算是完全的人工智能,基本上都是先进行人工干预才有所谓的智能。那么什么是人工干预呢?比如说你要训练一个模型去判断一张图像里面的动物是猫还是狗,那么大部分情况下,你要提前为这个模型提供大量的猫狗图像并明确告诉它每张图像中的动物是什么,这样模型才能根据它所学到的东西对新提供的图像进行分类。这一点就和婴儿的学习认知过程非常相似,婴儿在刚出生时,这个世界对他来说是陌生的,随着周围人不断教他学习和认识新事物,他的大脑中慢慢地就知道了每个事物及其对应的名字,以后当他再次遇到这些事物时,他就能够直接说出名字。虽然人工智能所涉及的技术难以进行完整描述,但不可否认的是,人工智能所涉及的算法,很大一部分都离不开机器学习。1.1.2 机器学习

相信很多技术从业者对机器学习这个名词并不陌生,即便不知道这个名词,也肯定享用过机器学习算法提供的服务,比如最常见的推荐。新闻推荐、音乐推荐、商品推荐等大部分服务都是通过机器学习算法实现的,这些算法基于你的数据构造用户画像,不断了解你的喜好,最后像你的秘书一样为你提供定制化服务。

大数据往往是与机器学习紧密相连的名词,因为随着信息的爆炸式增长,网上能够获取到的数据非常多,这些数据是机器学习算法能够发挥作用的主要原料。但是这些数据类型多样,既有结构化数据,又有非结构化数据,同时数据杂乱无章,因此如何有效利用这些数据就成为了大数据带来的挑战,而机器学习其实就是从大量无序的数据中整理并提取有效信息的过程。宏观来讲,机器学习包含数据获取、数据清洗、特征提取、模型构建、结果分析等过程,这其中的每一步都影响着最终的结果,并不仅仅是训练一个模型这么简单。机器学习工程师往往需要具备多学科的知识,比如数据清洗和特征提取需要做数据的统计分析,模型构建离不开线性代数,具体到某种场景领域的数据又需要你具有相关领域的知识储备才能做好特征提取的工作,另外整个过程还需要你具备一定的编程能力才能快速实现想法并反复试错,因此机器学习涉及多学科的知识,如果利用好了这些知识,往往就能取得理想的效果。

机器学习涉及的算法非常广泛,如果按照输入数据是否有标签来区分的话可以分为3种:有监督学习、无监督学习和半监督学习。有监督学习的算法是指你为算法提供的输入中包含标签,比如你要训练一个识别手写数字的分类器,那么当你提供一张手写数字的图片时,还要告诉分类器该图片上的数字是多少,这就是有监督学习。大部分的分类和回归算法都是有监督学习的算法,比如分类算法中的kNN、决策树、逻辑回归、支持向量机(Support Vector Machine,SVM)等,以及回归算法中的线性回归、树回归等。既然大部分的分类算法和回归算法都是有监督学习算法,那么二者之间有什么区别呢?区别在于分类算法的标签是类别,而回归算法的标签是数值,因此二者的应用场景也不一样。比如,你可以用分类算法去训练一个手写数字识别的分类器,因为手写数字的标签是类别(这里讨论的是整数数字),一般而言类别都是1、2、3这样的整数;你还可以用回归算法去训练一个房价预测、股票预测的模型,因为房价和股票价格都是数值,一般而言数值都是1234.56、40.01、999这样的实数。显然,与有监督学习算法相比,无监督学习算法并不会向算法提供标签,也就是说你为算法提供一堆手写数字的图像,但是并不告知每张图像的标签,然后让算法自行学习。无监督学习算法主要是聚类算法,比如K-Means,可以用来将具有相同属性的变量聚集在一起达到分类的效果。半监督学习算法是近年来的研究热点,因为我们常常难以获取大量带有标签的数据,但是又需要训练一个有监督学习模型,这时候就可以同时用带和不带标签的混合数据进行训练,这就是半监督学习算法。1.1.3 深度学习

在介绍深度学习之前首先需要了解下神经网络,神经网络是机器学习算法中的一个重要分支,通过叠加网络层模拟人类大脑对输入信号的特征提取,根据标签和损失函数的不同,既可以做分类任务,又可以做回归任务。我们知道在机器学习的大部分算法中,特征提取一般都是手动构造的,这部分需要非常丰富的经验和业务知识,特征构造的优劣将会直接影响到模型的效果,而神经网络可以通过叠加网络层直接基于输入数据提取特征,然后将提取到的特征作为分类或回归层的输入来完成分类或回归任务,这在非结构化数据(图像、语音、自然语言)处理方面已经初见成效。

深度学习就是基于神经网络发展而来的,所谓“深度”,一方面是指神经网络层越来越深,另一方面是指学习的能力越来越强,越来越深入。神经网络是一个概念很大的词,一般常听到的多层感知机也大致与神经网络相对应,所以下次当你听到多层感知机这个名词时就不再会是一头雾水了。神经网络是由多个层搭建起来的,这就好比一栋几十层的房子是一层一层搭建起来的一样,稍有不同的是,在神经网络中层的类型更多样,而且层与层之间的联系复杂多变。深度学习中的深度主要就是来描述神经网络中层的数量,目前神经网络可以达到成百上千层,整个网络的参数量从万到亿不等,所以深度学习并不是非常深奥的概念,其本质上就是神经网络。

神经网络并不是最近几年才有的概念,早在20世纪中期就已经有人提出了神经网络,那么既然深度学习是基于神经网络发展而来的,为什么到最近几年才引起人们的注意呢?因为训练深层神经网络需要大量的数据和计算力!大量的数据可以通过人为标注输送给模型,这相当于为模型提供了燃料;强大的计算力可以在短时间内训练好模型,这相当于为模型提供了引擎。最近几年正是有了数据和计算力的支持,深度学习才得以大爆发。即便如此,神经网络的结构搭建、训练优化等过程依然十分耗时,许多底层的层操作都需要自己实现,网上相关的开源项目也非常少,相当于一直在重复造轮子,效率非常低下。在这种背景下,各种开源的深度学习框架开始诞生,这些深度学习框架封装了大部分的底层操作,支持GPU加速,并为用户提供了各种语言的接口,以方便用户使用。随着这些框架的不断发展和优化,文档越来越详细、清晰,显存优化越来越好,接口支持的语言也越来越多。因此现在利用深度学习框架提供的接口,我们可以像搭积木一样灵活地搭建我们想要的网络,然后训练网络得到结果,这也大大加快了算法的产出。1.2 深度学习框架

目前大部分深度学习框架都已开源,不仅提供了多种多样的接口和不同语言的API,而且拥有详细的文档和活跃的社区,因此设计网络更加灵活和高效。另外,几乎所有的深度学习框架都支持利用GPU训练模型,甚至在单机多卡和分布式训练方面都有很好的支持,因此训练模型的时间也大大缩短了。深度学习框架的这些优点让其在开源之初就大受欢迎,同时大大加速了学术界和工业界对深度学习算法的研究,所以最近几年各领域的算法模型如雨后春笋般不断刷新各种指标。

目前主流的深度学习框架不到10个,而且大部分框架都由大公司的工程师在维护,代码质量非常高,选择一个合适的框架不仅能加快算法的优化产出,还能提高线上部署的效率。当然不同高校实验室或者企业团队所用的深度学习框架都不大一样,不过你不用担心现在所用的框架在以后的工作中用不到,毕竟各框架的设计理念都有许多相似之处,但我建议你至少要深入了解其中一个深度学习框架,多动手写代码,读一读该框架的源码,以求能够灵活使用该框架实现自己的想法,当然,如果你能对开源社区有一定的贡献并一起推动该框架发展那自然是再好不过了。虽然目前主流的深度学习框架有好几个,不过按照框架的设计方式大致可以将其分为命令式编程(imperative programming)和符号式编程(symbolic programming or declarative programming)两类。

命令式编程(或称动态图)并不是新奇的概念,而且很有可能你从一开始写代码的时候用的就是这种编程方式。假设你用Python来编程,当你已经为变量a、b、c赋值,然后要计算[(a+b)*c]-d的结果时,你可以先计算a+b得到结果,假设用变量ab表示,接着再计算ab和c的乘积,假设用变量abc表示,最后再用abc减去d得到最终的结果,这里每一步操作的结果都是可见的。可以看出,命令式编程非常灵活,当你不仅想得到最终的结果还想得到运算的中间结果时,比如你想要获取中间步骤a+b的结果,那么你可以读取变量ab来得到。因此命令式编程并不是新概念,而是我们最熟悉的那种编程方式。

符号式编程(或称静态图)是指先设计好计算图,然后初始化输入数据,最后将数据输入计算图得到最后的结果。再以前面列举的计算[(a+b)*c]-d为例,对于符号式编程而言,当你为a、b、c、d赋值后,将这4个值输入你定义好的计算图[(a+b)*c]-d就可以直接得到结果。与命令式编程不同的是,在符号式编程中,要想获取中间结果几乎是不可能的,比如(a+b)的值,你能得到的只是最终的结果。可以看出,符号式编程虽然不灵活,但是非常高效,为什么这么说呢?因为符号式编程在设计好计算图之后就可以根据该计算图高效利用存储空间,一些变量的存储空间能复用则复用。

那么深度学习框架为什么会有命令式编程和符号式编程这两种方式呢?主要是希望能在灵活和高效之间取得平衡。深度学习框架有一定的入门门槛,命令式编程可以让这个门槛变得很低,因为这就是我们最熟悉的编程方式。但我们都知道在GPU上训练深度学习模型时需要用到显存,如果是命令式编程,则每运行网络的一层就会分配显存中的一块空间来保存特征图或其他参数,部分空间的使用频率非常低,这样就会造成大量的显存占用。如果采用符号式编程,那么当你设计好整个计算图之后,框架会根据你的计算图分配显存,这个步骤会共享部分空间从而减小整个网络所占用的显存。因此符号式编程虽然不如命令式编程灵活,但能高效利用显存。

总结起来,命令式编程注重灵活,符号式编程注重高效。本书主要通过深度学习框架MXNet来介绍如何实战深度学习算法,该框架融合了命令式编程和符号式编程,在灵活和高效之间取得了非常好的平衡。正如前文所述,各深度学习框架之间有很多相似性,当你深入了解其中一种深度学习框架之后基本上就能举一反三,因此如果你现在还在犹豫学习哪个深度学习框架,那么不妨跟着本书从MXNet开始,我相信这会是一个美好的开始。1.2.1 MXNet

MXNet是亚马逊(Amazon)官方维护的深度学习框架。MXNet官方文档地址:https://mxnet.apache.org/,GitHub地址:https://github.com/apache/incubator-mxnet。

MXNet的前身是cxxnet。2015年年底,cxxnet正式迁移至MXNet,并在2016年年底成为Amazon的官方深度学习框架。MXNet采用的是命令式编程和符号式编程混合的方式,具有省显存、运行速度快等特点,训练效率非常高。2017年下半年推出的Gluon接口使得MXNet在命令式编程上更进一步,网络结构的构建更加灵活,同时混合编程的方式也使得Gluon接口兼顾了高效和灵活。2018年5月,MXNet正式推出了专门为计算机视觉任务打造的深度学习工具库GluonCV,该工具库提供了包括图像分类、目标检测、图像分割等领域的前沿算法复现模型和详细的复现代码,同时还提供了常用的公开数据集、模型的调用接口,既方便学术界研究创新,也能加快工业界落地算法。1.2.2 PyTorch

PyTorch是Facebook官方维护的深度学习框架之一,是基于原有的Torch框架推出的Python接口。PyTorch的官方文档地址:https://github.com/pytorch,GitHub地址:https://github.com/pytorch。

Torch是一种深度学习框架,其主要采用Lua语言,与主流的Python语言相比,学习Lua语言需要一定的成本,因此为了更加便于用户使用,基于Torch开发出了Python接口并不断优化,从而诞生了PyTorch。PyTorch采用的是命令式编程,搭建网络结构和调试代码非常方便,因此其很适合用于学术界研究试错,相信用过PyTorch的同学都会为该框架的灵活性所吸引。

PyTorch于2017年年初开源,虽然比其他大部分深度学习框架开源时间要晚,但快速发展的PyTorch目前拥有较为完善的接口和文档,在众多深度学习框架中已经是出类拔萃、深受追捧。1.2.3 Caffe/Caffe2

Caffe是Facebook官方维护的深度学习框架之一,Caffe的官方文档地址:http://caffe.berkeleyvision.org/,GitHub地址:https://github.com/BVLC/caffe。

Caffe是老牌的深度学习框架,相信很多早期入门深度学习的人都用过Caffe,尤其是对安装Caffe时的依赖印象深刻。Caffe非常容易上手,同时开源时间较早,这些都为Caffe框架积累了丰富的预训练模型,使其在工业界和学术界都得到了广泛的应用。2017年4月,Facebook正式推出了Caffe的升级版Caffe2,在Facebook内部Caffe/Caffe2侧重于线上产品部署,PyTorch则侧重于研究试错。2018年4月,Caffe2的代码已经与PyTorch代码合并,目前代码已经迁移至PyTorch的GitHub地址:https://github.com/pytorch,并推出了PyTorch1.0。1.2.4 TensorFlow

TensorFlow是Google官方维护的深度学习框架,TensorFlow的官方文档地址:https://tensorflow.google.cn/,GitHub地址:https://github.com/tensorflow/tensorflow。

TensorFlow自2015年年底开源以来,在GitHub上的火热程度非同一般,也是目前使用最广泛的深度学习框架之一。TensorFlow为用户提供了丰富的接口、完善的社区、可视化工具TensorBord等。尤其是可视化工具TensorBord可以让用户查看和记录模型训练过程中的参数变化情况,从而方便对模型进行调优。经过几年的发展壮大,完善的生态为TensorFlow积累了越来越多的用户,这对于一个深度学习框架而言非常重要。1.2.5 其他

除了前面提到的几个深度学习框架之外,还有一些深度学习框架也非常受欢迎。Keras,一个基于TensorFlow和Theano且提供简洁的Python接口的深度学习框架,上手非常快,受欢迎程度非常高。Theano,老牌的深度学习框架之一,由蒙特利尔大学的机器学习团队开发,不过Theano的开发者在2017年下半年时宣布将终止Theano的开发和维护。CNTK,微软官方维护的深度学习框架,也是基于符号式编程。PaddlePaddle,百度官方维护的深度学习框架,是国内公司最早开源的深度学习框架。1.3 关于MXNet

在众多主流的深度学习框架中,很难说哪一个在各方面都占有绝对优势,但是假如你选择MXNet进行深度学习算法的开发和部署,相信你一定能体会到其运行速度快、省显存等优点。另外随着MXNet的不断推广,相关的学习资料也越来越多,社区越来越壮大,这对于MXNet而言是非常利好的。

MXNet从开源起就将命令式编程和符号式编程无缝衔接在一起,比如在设计神经网络结构时采用符号式编程得到计算图,然后根据计算图进行一系列的优化从而提高性能,而在训练模型过程中涉及的逻辑控制操作则可以通过命令式编程的方式实现。因此MXNet在灵活和高效之间取得了非常好的平衡,这使得MXNet不仅适合于学术界研究试错,也适合工业界进行线上部署。事实上,成功很少会有捷径,MXNet虽然是2015年年底开源,但在开源之前其实经历了较长的开发期,属于典型的厚积薄发。1.3.1 MXNet的发展历程

在MXNet诞生之前,已有一个深度学习框架cxxnet,该框架比较成熟,不仅可扩展性强,而且拥有统一的并行计算接口;另外还有一个接口Minerva,这是一个比较灵活的类似于NumPy的计算接口,当时还在CMU读博的李沐就和这两个项目的开发者一起将二者结合在一起,最终诞生了MXNet,MXNet这个名字也是前面两个项目名字的组合。

2015年9月,cxxnet正式迁移至MXNet,这也标志着MXNet正式开源。作为cxxnet的优化版本,MXNet在实现了cxxnet所有功能的基础上加入了更多新的功能,比如NDArray模块和Symbol模块,同时其速度更快,显存占用更少。另外MXNet提供了更加灵活且直观的接口,更加便于用户使用,详细内容可以参考MXNet官方文档。该文档中提供了详细的接口介绍和使用方法,文档地址:https://mxnet.incubator.apache.org/,同时MXnet官方开源了代码,感兴趣的读者可以访问:https://github.com/apache/incubator-mxnet了解。

2016年年底,Amazon宣布正式将MXNet作为官方使用的深度学习框架。当时的背景是TensorFlow已经开源了一年左右,普及速度非常快;Caffe作为深度学习框架的元老,积累了非常多的用户。这两种深度学习框架对处于快速发展中的MXNet施加了很大的压力,毕竟那段时间MXNet的开发者们的主要精力还放在开发上,框架推广上的力度还不够,因此此时加入Amazon这一事件给了MXNet很大的支持,进一步推动了MXNet后期的快速发展和推广。

2017年8月,MXNet发布了0.11版本,该版本最大的改进就是发布了动态图接口Gluon。采用命令式编程的Gluon接口使得网络结构的设计更加灵活,同时也更便于代码调试。Gluon和PyTorch拥有许多共同点,比如命令式编程的特点、主要的接口设计等,目前Gluon接口已经成为MXNet框架非常重要的一部分。为了方便读者交流学习,Gluon官方推出了技术论坛,该技术论坛目前非常活跃,感兴趣的读者可以访问Gluon官方论坛:https://discuss.gluon.ai/。

2018年5月,MXNet正式推出了专门为计算机视觉任务打造的深度学习工具库GluonCV,该工具库提供了包括图像分类、目标检测、图像分割等领域的前沿算法复现模型。GluonCV主要以Gluon接口为例进行实现,而且提供了详细的复现代码,从方便读者研究学习。目前GluonCV库的代码已经开源,代码地址:https://github.com/dmlc/gluon-cv,GluonCV库官方文档地址:https://gluon-cv.mxnet.io/。官方文档中还提供了预训练模型的下载链接、复现代码的下载链接、各种接口介绍和教学的例子,非常便于读者学习。

2018年10月,MXNet推出GluonCV 0.3.0版本,新版本不仅添加了图像分类、目标检测、图像分割等领域新的算法模型,而且对已有的复现模型也做了优化,使得算法模型在效果上有了进一步的提升。目前GluonCV还在快速发展中,内容也越来越丰富,强烈推荐读者使用和学习。

2018年11月,MXNet正式推出1.3.1版本,该版本提供了更加完善的接口,考虑到目前GluonCV库需要1.3.0以上版本的MXNet才能支持,因此本书代码将基于MXNet 1.3.1版本进行开发。

MXNet主打小巧和灵活,版本更新速度快而且兼容性好,接口方面基本上紧跟前沿的算法,能够及时实现前沿算法中的自定义操作,并整合到MXNet框架的接口中。比如目标检测(object detection)算法中比较优秀的SSD,其中关于default boxes的生成和检测层都有对应的实现,用户可以直接调用MXNet的指定接口。再比如图像分割领域的Mask RCNN算法中用到的ROIAlign层在MXNet也有对应的实现。这些都说明MXNet的开发者一直致力于开发和维护MXNet,基本上两、三个月的时间就会发布新版本,如此活跃的社区必将推动MXNet的快速发展。虽然MXNet发布新版本的节奏较快,但有一个好处在于每次发布的新版本对原有接口的改动非常小,主要是修改bug和增加新的接口,因此这不仅大大降低了代码维护的成本,还提供了更加丰富的接口选择。1.3.2 MXNet的优势

就像任何事物都有两面性一样,几个主流的深度学习框架也各有优缺点。Caffe框架作为最优秀的深度学习框架之一,一直深受广大用户的欢迎,其优点是非常容易上手,积累的用户也很多;缺点是安装比较麻烦,会涉及各种环境依赖,另外要想灵活应用的话对新手而言还是比较困难的,而且该框架本身比较占用显存。TensorFlow是目前应用最为广泛的深度学习框架,TensorFlow的优点在于丰富的接口以及Google的强大技术支持,从开源以来,其积累了非常多的用户,并且随着学术界和工业界的不断推广,TensorFlow的用户群体也在不断壮大。TensorFlow宏观来看就是“大而全”,这种特点带来的问题就是其接口过于丰富,因此对于新人而言入门较难,往往会面临的问题是要实现一个简单的层却不知道该选择什么样的接口。PyTorch作为主流的深度学习框架中的后起之秀,是在原来已有的Torch框架上封装了Python接口并优化而成的,相信很多使用过PyTorch的读者都会被PyTorch的简洁所吸引,这得益于其命令式编程的设计方式,因此非常适合用于搞研究,或者称为快速试错;当然纯命令式编程的方式带来的问题是工业界线上部署的效率问题,所以Facebook内部对PyTorch的定位也是研究首选,而线上部署方面则是首选Caffe/Caffe2。另外由于PyTorch目前还在快速迭代中,所以文档和接口变化较大,新手需要一定的时间来适应。

那么为什么我推荐使用MXNet呢?有以下几个原因。

1)MXNet结合了命令式编程和符号式编程,因此兼顾了灵活和高效,既方便研究试错又适合线上部署。

2)框架比较稳定。MXNet从开源至今已经经历了早期开发时频繁迭代的阶段,目前接口基本上比较稳定,这将大大降低代码维护的成本。

3)MXNet在显存方面的优化做得非常好,可以帮助你节省机器资源,而且在训练相同的模型时,MXNet比大多数的深度学习框架的训练速度要快,这也能节省不少的训练时间。

4)MXNet安装方便,文档清晰,例子丰富,非常方便新人上手学习。

总结起来,对于深度学习框架而言,没有最好的,只有最适合的。如果在高校做研究,那么我会推荐使用MXNet或者PyTorch,这两者非常便于设计网络结构和调试;如果是在工业界需要上线部署模型,那么我会推荐使用MXNet、TensorFlow或Caffe。1.4 MXNet开发需要具备的知识

入门MXNet与入门其他深度学习框架类似,一般而言只要你具备基本的代码能力和算法基础就可以开始使用MXNet训练模型了。在应用MXNet的过程中,希望读者能够多看文档和源码,毕竟各类接口的详细定义和使用都是通过文档来介绍的,部分接口源码也并非高深莫测,只要具备基本的代码编写能力都能看得懂。

虽然入门MXNet并不需要具备特殊的知识,但是为了让读者更好地入门MXNet,接下来本节将介绍一下MXNet开发所涉及的相关知识和一些误区。需要强调的是,即便你目前并没有完全掌握这些知识也不用担心,在本书的后续章节中会不断穿插和讲解这些知识,希望读者能够通过不断学习本书的内容来夯实这些知识。1.4.1 接口语言

MXNet框架提供了多种语言的API(比如Python、C++、Scala、Julia、Perl、R等),因此不管你之前使用的是什么语言,都能够在这里找到合适的API进行算法开发。

在主流的深度学习框架以及开源的各类深度学习算法中,Python语言的应用应该是最为广泛的,从MXNet框架的各种API中也可以看出,Python是文档最丰富、支持最为完善的接口,因此入门深度学习首选Python语言,本书也是采用Python API来介绍如何实战MXNet。当然,你千万不要误以为深度学习框架都是用Python实现的,事实上包括Python在内的API都只是接口,这些接口面向用户进行调用,实际上大部分深度学习框架的底层都是用C++实现的,主要原因在于C++的计算效率非常高,可以满足深度学习大量计算的要求,相比之下Python更加灵活,容易上手,因此比较适合作为接口语言。因此对于入门而言,Python语言绝对是不二选择,对于进阶而言,可能你需要用C++或者CUDA编程写一些底层实现,但是接口语言大部分还是采用Python。1.4.2 NumPy

NumPy(Numerical Python)是Python语言中用于科学计算的非常基础和重要的库,支持大量的数组和矩阵运算。NumPy中最常用的数据类型是array,array翻译过来就是数组的意思,在NumPy中array可以是多维的,比如0维的array就是标量,1维的array就是向量,2维的array就是矩阵等。

为什么要了解NumPy呢?因为大多数深度学习框架的基础数据结构都参考了NumPy中的array,比如MXNet框架中的NDArray、TensorFlow和PyTorch框架中的Tensor等。那么既然有NumPy array,为什么不直接在框架中使用这种数据结构呢?主要原因在于NumPy array只能在CPU上运行,不能在GPU上运行,因此在MXNet中就引入了NDArray,NDArray的大部分用法与NumPy array相似,最大的不同点在于NDArray可以在GPU上运行。因此,了解和熟悉NumPy的相关知识对于后续学习MXNet的NDArray接口以及其他代码实现都有一定的帮助。1.4.3 神经网络

通常我们都是用MXNet来训练深度学习模型,因此在MXNet中定义的接口和算法内容是相关的,所以读者最好具备基础的神经网络知识,这些知识包括如下几个方面。

1)神经网络基础层的含义。比如卷积层、池化层、全连接层、激活层、损失函数层的计算过程、网络层参数的含义及作用等。

2)优化算法。比如最常用的随机梯度下降(Stochastic Gradient Descent,SGD),了解梯度反向传播和优化的基础知识。

3)损失函数。明白损失函数在深度学习算法中的作用,熟悉常用算法的损失函数,比如分类算法中常用的交叉熵损失函数(cross entropy loss),目标检测算法中常用的Smooth L1损失函数等。

当然如果你真的一点也不了解神经网络那也不用担心,本书的后续章节会介绍算法相关的内容,另外还会介绍最近几年较为流行且实用的网络结构以帮助读者理解和入门。1.5 本章小结

数据的爆发和计算力的提升极大地推动了人工智能的发展,其中以深度学习为代表的算法在大多数领域都超越了传统算法,成为学术界和工业界持续研究和关注的对象。

深度学习的热潮带来了深度学习框架的不断发展和进步,通过这些框架,我们可以更加灵活且高效地设计网络结构和训练模型。这段时期涌现出来众多优秀的深度学习框架,比如Amazon的MXNet、Google的TensorFlow、Facebook的Caffe/Caffe2和PyTorch等。MXNet作为Amazon官方支持的深度学习框架,自2015年下半年开源以来深受用户喜爱,其命令式编程(imperative programming)和符号式编程(symbolic programming)相结合的方式兼顾了灵活性和高效性,因此不论是高校研究还是企业部署都具有一定的优势。同时MXNet拥有详细的文档和稳定的接口,不仅降低了上手门槛,而且还降低了代码维护的成本。

上手MXNet并不需要你具备特殊知识,一般而言,只要你具备基本的代码编写能力和算法知识就可以开始你的深度学习之旅了。最后,为了方便读者学习,全书所涉及的代码在GitHub上均可下载,项目地址是:https://github.com/miraclewkf/MXNet-Deep-Learning-in-Action,如果后期本书中的内容或代码有修正也会在该项目上发布说明,欢迎读者访问。第2章搭建开发环境

MXNet官方提供了多种安装方式,安装过程非常简单,详细内容请参考官方安装链接:https://mxnet.incubator.apache.org/install/index.html,本章中关于MXNet的安装主要参考这个官方链接。该链接中提供了多种安装MXNet的方式,如图2-1所示,这里一共显示了5行安装内容,每行又包含多个选项。第一行表示MXNet的版本,点击下拉选项可以选择不同版本的MXNet;第二行表示操作系统,比如最常用的Linux、MacOS和Windows等;第三行表示API,最常用的是Python语言的接口;第四行表示训练环境,简单来讲就是,是否需要GPU;第五行表示不同的安装方式,比如通过pip工具进行安装、通过Docker进行安装等。图2-1 MXNet安装方式

当你选择好了图2-1中的这些选项,安装界面就会按照你的选项给出详细的安装步骤供你参考。本章将以其中最常用的两种安装方式为例介绍如何安装MXNet,一种是采用Docker安装,另一种是采用pip在本地安装。

Docker是一个环境隔离工具,目前在工业界应用非常广泛,采用这种方式其实并不需要你安装MXNet,而只需先安装Docker,然后通过Docker这个工具从镜像(image)库中拉取MXNet镜像就可以直接使用MXNet了。为什么Docker会得到广泛应用呢?主要原因在于一方面你可以在一个镜像环境中运行你的代码,这个环境与你的电脑环境是隔离的,这样你在镜像中的安装和配置操作都不会影响到你的电脑环境,同时还能保证在你电脑上能够正常运行的代码移植到他人电脑上一样能正常运行,因为只要提供相同的镜像就能保证代码的运行环境相同。另一方面是方便,你想要什么样的镜像都可以从网上拉取,比如你想用CUDA 9.0、MXNet 1.3.1或者CUDA 8.0、MXNet 1.3.1等,那么直接从镜像库中拉取对应版本的镜像即可,这样你就不需要每次都在本地安装,可谓是一劳永逸。目前Docker的发展比较成熟,官方镜像库中提供了非常丰富的选择,大部分镜像中还安装好了CUDA、cuDNN、OpenCV等常用工具或库,因此基本上是拉取后就能直接使用,非常方便。当然,对于新手而言,学习Docker的安装和使用还需要一些时间,因此假如你想要快速上手深度学习框架,那么可以考虑第二种安装方式,也就是通过pip命令进行安装。

本地pip安装就是平时我们最熟悉的直接在电脑上安装MXNet,只要配置好相关的环境,比如显卡驱动、CUDA、cuDNN和其他所需的工具,安装MXNet就只是一行命令的事了。这种安装方式比较直接易懂,但是容易出现的问题是后续的环境依赖不好维护,虽然安装MXNet不需要配置太多的环境依赖,但是随着相关库或者软件的不断使用和升级,环境依赖会变得越来越复杂,后期很容易出现这样的问题:在你的电脑上能正常运行的代码移植到他人的电脑上无法正常运行,或者要经过比较复杂费时的环境配置后才能正常运行。

因此如果你有一定的开发能力及经验,项目中需要进行环境隔离,尤其是有代码移植的需要时,那么推荐你安装Docker,然后在Docker镜像中运行你的MXNet项目。如果你刚刚入门,暂时不需要做环境隔离,并且相信后期不会因为环境依赖问题而搞得焦头烂额,那么采用本地pip安装会更加直观。2.1 环境配置

目前,使用GPU基本上是应用深度学习框架时的默认配置了,毕竟现在仅仅用CPU来训练深度学习算法非常慢,而且进行这样操作的人也非常少,因此我在本章中关于开发环境的搭建都是基于GPU进行介绍,需要注意的是,支持GPU的MXNet既可以在GPU上运行,也可以在CPU上运行,但如果你安装的是仅支持CPU的MXNet,那么就只能在CPU上运行了。相比之下,安装支持GPU的深度学习框架要比安装仅支持CPU的深度学习框架更复杂一些,因为要额外安装CUDA、cuDNN等,所以如果你想安装仅支持CPU的MXNet,那么基本上输入几个命令就可以了。

深度学习框架所需要的开发环境主要包括操作系统、显卡驱动、CUDA和cuDNN,这些基本上是你在使用MXNet或者其他深度学习框架时都会涉及的,其中,显卡驱动、CUDA和cuDNN是你安装支持GPU的MXNet时需要准备的。操作系统是最基本的开发环境,你的所有操作都是基于该系统进行的。显卡驱动是使用GPU硬件时要安装的,而且需要与你的GPU型号相匹配。CUDA是英伟达(NVIDIA)官方推出的统一计算架构,是使用支持GPU的深度学习框架时必不可少的内容。cuDNN是英伟达(NVIDIA)推出的加速库,一般在你安装深度学习框架之前都会默认安装。另外,在集成开发环境方面(IDE)推荐使用PyCharm,项目开发和代码调试都十分方便,接下来我们依次介绍各项环境配置的内容。

在操作系统方面,我推荐使用Linux,本书采用的是目前使用最广泛的Linux版本:Ubuntu。目前Ubuntu主要有18.04 LTS和16.04 LTS两个主流版本,考虑到Ubuntu16.04 LTS比较稳定且应用广泛,因此本书的所有代码均基于Ubuntu16.04 LTS进行开发。如果你想查看自己机器的系统信息,可以在命令行通过以下命令来查看。符号“$”表示Ubuntu系统的终端操作界面的命令行前缀,在本书中符号“$”表示一条命令的开始,这一点与大部分系统的定义一致。另外,如果没有特殊指明的话,不以符号“$”开头的内容均表示输入命令后的运行结果。查看系统信息的代码如下:注意 本书中的命令行命令、命令行输出、Python代码和Python代码输出都会添加灰色底纹加以区分。

在显卡驱动方面,如果你的GPU机器还没有安装显卡驱动,那么你将无法使用GPU训练模型。假设你已经安装好了显卡驱动,那么可以使用下面这个命令查看你的显卡信息:

如果运行该命令没有报错且显示了如图2-2所示的关于显卡的具体信息,那就说明你的机器上已经安装了可用的显卡驱动。图2-2 显卡信息

图2-2中除了显示显卡型号信息之外,还有每块GPU的显存上限、当前显存的使用情况和利用率等信息,另外还可以使用下面的命令动态查看显存的占用情况,默认每2秒刷新一次:

显卡驱动的安装并不复杂,在安装驱动前,首先要从网上下载指定型号和版本的驱动文件,英伟达(NVIDIA)官方提供了显卡驱动的下载地址:https://www.geforce.com/drivers。用户可以根据自己机器上GPU的型号选择对应的显卡驱动和版本进行安装。以常用的GeForce GTX 1080 Ti显卡为例(本书采用的显卡型号),首先在下载地址中选择对应的显卡类型,如图2-3所示,这里选择GeForce GTX 1080 Ti,然后点击下方的START SEARCH就可以得到各种版本的显卡驱动,比如图2-3中显示了两种版本的显卡驱动,一个版本是415.13(Version 415.13),另一个版本是410.78(Version 410.78)。点击你需要的显卡驱动就会进入下载界面,然后点击下载就可以得到对应版本的驱动,最后安装驱动文件即可。需要说明的是,显卡驱动基本上都是向下兼容的,因为我们选用CUDA 8.0版本,所以目前大部分显卡驱动都是支持的,驱动版本不需要完全一样。在本书中,我采用的显卡驱动版本是384.130,前面提到的查看显卡信息的命令就可以看到显卡驱动的版本,具体而言是图2-2顶部的Driver Version内容。

CUDA(Compute Unified Device Architecture)是英伟达(NVIDIA)官方推出的统一计算架构,支持GPU的MXNet的许多底层计算都会用到CUDA加速库。目前常用的CUDA版本是CUDA 8.0和CUDA 9.0,鉴于目前CUDA 8.0应用广泛且比较稳定,因此本书采用CUDA 8.0。关于CUDA的安装,可以参考英伟达的CUDA官方文档。图2-3 显卡驱动下载界面®

cuDNN(NVIDIA CUDADeep Neural Network)是英伟达推出的加速库,一般在你安装MXNet之前默认安装,因为MXNet的很多底层计算都是基于cuDNN库实现的,本书采用的cuDNN版本是cuDNN 7.0.3。关于cuDNN的安装,可以参考英伟达的cuDNN官方链接。

虽然Python代码可以通过各种Python解释器运行或者进行交互式编写(比如,我们在命令行通过运行Python或者Python3命令进入的Python环境,其实就是启动了CPython解释器,这是目前使用非常广泛的Python解释器),但是我们知道深度学习算法的项目代码一般都比较复杂,对于复杂的工程代码而言,如果仅依靠Python解释器来编写和调试代码就比较麻烦了,因此需要一个合适的开发环境(IDE)方便用户编写、调试和运行深度学习的Python代码,如果读者目前已经有用得比较顺手的IDE,那么可以不用更换,如果没有的话,可以尝试使用PyCharm。PyCharm是一个主要用于Python语言开发的集成开发环境,用户可以通过PyCharm编写、调试、运行Python代码,非常方便。

读者可以从PyCharm的官方网站上下载并安装指定系统环境和版本的PyCharm,参考链接如下:https://www.jetbrains.com/pycharm/download/#section=linux,该链接中也包含了相关的教学,对于新手而言,PyCharm入门的门槛较低。目前PyCharm主要有专业版(professional)和社区版(community)两个版本可选,如图2-4所示。专业版PyCharm需要购买才能长期使用。社区版PyCharm可以免费使用,对于普通的Python开发而言基本上已经足够了,不过目前只有专业版PyCharm支持Docker。图2-4 PyCharm下载界面

本书的大部分代码采用的编程语言是Python,目前Python也是各大深度学习框架中文档最丰富的接口语言。虽然当前广泛使用的Python版本是Python2.x,但是因为Python2.x在2020年将不再维护,所以本书采用的Python版本是Python3.x,具体而言是Python3.5.2。2.2 使用Docker安装MXNet

本节将介绍如何安装Docker,以及如何通过Docker使用MXNet。相信很多开发者都曾经被环境依赖搞得焦头烂额,几年前配置深度学习框架的环境确实是一件令人非常头疼的事情,因为会涉及各种环境依赖,而且即便你配置好了,也会出现在你的电脑上可以正常运行的代码一旦移植到另外一台电脑上,却不能正常运行的问题,为了解决这种问题,Docker横空出世了。

什么是Docker?简单来讲,Docker可以做环境隔离,既通过Docker的镜像(image)来封装代码所需的环境依赖,这样你只需要复制你的项目代码和指定的Docker镜像,就可以直接在另外一台电脑上复现结果,这大大降低了代码从一台电脑移植到另外一台电脑时出现环境不兼容的概率。镜像是Docker中非常重要的内容,可以理解为将一些环境依赖打包在一起构成的对象。另外,在使用Docker的过程中经常会看到一个名词:容器(container),容器和镜像的关系就好比类和对象的关系,我们可以基于一个镜像启动多个容器,每个容器可以正常运行各自的代码。

接下来介绍如何安装Docker,这里我推荐安装Docker社区版(Docker Community Edition,Docker CE)。安装Docker CE可以参考官方链接,下面我们主要按照该链接的流程来安装Docker。该链接中介绍了安装Docker的三种方式,接下来我将以其中最常用的两种安装方式为例来安装Docker。另外,在2.2.4节我将介绍nvidia-docker的安装方式,该命令能够将你本机的显卡驱动映射到镜像中,这样就能在镜像中使用GPU了。2.2.1 准备部分

因为目前大部分人训练深度学习算法都是在Linux操作系统上进行的,其中以Ubuntu的使用最为广泛,Docker CE目前支持以下版本的Ubuntu操作系统。·Bionic 18.04(LTS)·Artful 17.10·Xenial 16.04(LTS)·Trusty 14.04(LTS)

因为Xenial 16.04(LTS)的使用比较广泛,所以接下来的安装都基于Xenial 16.04(LTS)进行。如果你想要查看你的Linux系统版本信息,可以在命令行输入以下命令获取,然后根据VERSION信息选择对应版本的Docker CE:

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载