《MXNet深度学习实战》—1.2 深度学习框架
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,该工具库提供了包括图像分类、目标检测、图像分割等领域的前沿算法复现模型和详细的复现代码,同时还提供了常用的公开数据集、模型的调用接口,既方便学术界研究创新,也能加快工业界落地算法。
- 点赞
- 收藏
- 关注作者
评论(0)