您好,欢迎来到聚文网。 登录 免费注册
MXNET深度学习实战

MXNET深度学习实战

  • 字数: null千字
  • 装帧: 平装
  • 出版社: 机械工业出版社
  • 作者: 魏凯峰
  • 出版日期: 2019-05-01
  • 商品条码: 9787111626800
  • 版次: 1
  • 开本: 16开
  • 页数: 308
  • 出版年份: 2019
定价:¥89 销售价:登录后查看价格  ¥{{selectedSku?.salePrice}} 
库存: {{selectedSku?.stock}} 库存充足
{{item.title}}:
{{its.name}}
精选
内容简介
深度学习领域开始受到越来越多的关注,各大深度学习框架也孕育而生,在这个阶段,我被深度学习深深吸引并逐渐开始学习相关知识。研究生毕业后,我继续从事算法相关的工作,具体而言是深度学习算法在图像领域的应用,也就是常说的计算机视觉算法。MXNet和PyTorch这两个框架我都非常喜欢,不过目前市面上关于MXNet框架的书籍较少,而且MXNet发展至今各种接口比较稳定,用户体验挺不错的,所以最终决定以MXNet框架来写这本深度学习实战教程。MXNet是亚马逊官方维护的深度学习框架,在灵活性和高效性方面都做得很棒,非常推荐读者学习。本书的写作难度比想象中要大许多,在写作过程中许多零散的知识点需要想办法串联起来,让不同知识储备的人都能看懂,许多环境依赖需要从头到尾跑一遍来确认清楚。写书和写博客(AI之路)优选的区别在于书籍在出版后修正比较麻烦,不像博客,随时发现错误都可以修改,因此在写作过程中对许多细节和措辞都推敲了很久,自己也从中学到了许多。
作者简介
魏凯峰,资深计算机视觉算法工程师,在MXNet、Pytorch、深度学习相关算法等方面有深入的研究和丰富的实践经验。
目前就职于网易杭州研究院,从事计算机视觉算法相关的工作,主要研究方向包括目标检测、图像分类、图像对抗算法、模型加速和压缩。
热衷于分享,乐于在GitHub上分享算法相关的代码,坚持在CSDN上撰写算法相关的博客,累计百余篇,访问量过百万。
目录
目    录前言第1章  全面认识MXNet11.1  人工智能、机器学习与深度学习21.1.1  人工智能21.1.2  机器学习21.1.3  深度学习41.2  深度学习框架41.2.1  MXNet61.2.2  PyTorch61.2.3  Caffe/Caffe271.2.4  TensorFlow71.2.5  其他71.3  关于MXNet81.3.1  MXNet的发展历程81.3.2  MXNet的优势91.4  MXNet开发需要具备的知识101.4.1  接口语言111.4.2  NumPy111.4.3  神经网络111.5  本章小结12第2章  搭建开发环境132.1  环境配置142.2  使用Docker安装MXNet192.2.1  准备部分192.2.2  使用仓库安装Docker202.2.3  基于安装包安装Docker232.2.4  安装nvidia-docker232.2.5  通过Docker使用MXNet252.3  本地pip安装MXNet272.4  本章小结29第3章  MXNet基础313.1  NDArray313.2  Symbol373.3  Module433.4  本章小结48第4章  MNIST手写数字体分类504.1  训练代码初探524.2  训练代码详细解读554.2.1  训练参数配置564.2.2  数据读取594.2.3  网络结构搭建594.2.4  模型训练614.3  测试代码初探624.4  测试代码详细解读644.4.1  模型导入644.4.2  数据读取664.4.3  预测输出674.5  本章小结68第5章  数据读取及增强695.1  直接读取原图像数据705.1.1  优点及缺点705.1.2  使用方法715.2  基于RecordIO文件读取数据755.2.1  什么是RecordIO文件755.2.2  优点及缺点765.2.3  使用方法765.3  数据增强785.3.1  resize795.3.2  crop835.3.3  镜像895.3.4  亮度905.3.5  对比度925.3.6  饱和度 945.4  本章小结95第6章  网络结构搭建976.1  网络层986.1.1  卷积层986.1.2  BN层1066.1.3  激活层1086.1.4  池化层1116.1.5  全连接层1146.1.6  损失函数层1166.1.7  通道合并层1196.1.8  逐点相加层1216.2  图像分类网络结构1226.2.1  AlexNet1236.2.2  VGG1246.2.3  GoogleNet1256.2.4  ResNet1286.2.5  ResNeXt1306.2.6  DenseNet1316.2.7  SENet1326.2.8  MobileNet1346.2.9  ShuffleNet1366.3  本章小结138第7章  模型训练配置1407.1  问题定义1417.2  参数及训练配置1427.2.1  参数初始化1427.2.2  优化函数设置1447.2.3  保存模型1457.2.4  训练日志的保存1467.2.5  选择或定义评价指标1477.2.6  多GPU训练1507.3  迁移学习1517.4  断点训练1537.5  本章小结154第8章  图像分类1568.1  图像分类基础知识1578.1.1  评价指标1588.1.2  损失函数1608.2  猫狗分类实战1608.2.1  数据准备1618.2.2  训练参数及配置1658.2.3  数据读取1688.2.4  网络结构搭建1708.2.5  训练模型1718.2.6  测试模型1768.3  本章小结179第9章  目标检测1809.1  目标检测基础知识1829.1.1  数据集1849.1.2  SSD算法简介1889.1.3  anchor1899.1.4  IoU1949.1.5  模型训练目标1959.1.6  NMS1999.1.7  评价指标mAP2019.2  通用目标检测2029.2.1  数据准备2039.2.2  训练参数及配置2059.2.3  网络结构搭建2089.2.4  数据读取2159.2.5  定义训练评价指标2189.2.6  训练模型2209.2.7  测试模型2219.4  本章小结224第10章  图像分割22510.1  图像分割22610.1.1  数据集22710.1.2  评价指标22910.1.3  语义分割算法23010.2  语义分割实战23110.2.1  数据准备23210.2.2  训练参数及配置23310.2.3  数据读取23710.2.4  网络结构搭建24010.2.5  定义评价指标24510.2.6  训练模型24910.2.7  测试模型效果25110.3  本章小结253第11章  Gluon25511.1  Gluon基础25611.1.1  data模块25611.1.2  nn模块26011.1.3  model zoo模块26511.2  CIFAR10数据集分类26711.2.1  基于CPU的训练代码26711.2.2  基于GPU的训练代码27211.2.3  测试代码27511.3  本章小结276第12章  GluonCV27812.1  GluonCV基础27912.1.1  data模块28012.1.2  model zoo模块28512.1.3  utils模块29212.2  解读ResNet复现代码29312.2.1  导入模块29612.2.2  命令行参数设置29612.2.3  日志信息设置29712.2.4  训练参数配置29812.2.5  模型导入30012.2.6  数据读取30112.2.7  定义评价指标30312.2.8  模型训练30312.3  本章小结308
摘要
    第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  MXNetMXNet是亚马逊(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  PyTorchPyTorch是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/Caffe2Caffe是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  TensorFlowTensorFlow是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  NumPyNumPy(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,如果后期本书中的内容或代码有修正也会在该项目上发布说明,欢迎读者访问。

蜀ICP备2024047804号

Copyright 版权所有 © jvwen.com 聚文网