一、Theano
Theano由LISA集团(现MILA)在加拿大魁北克的蒙特利尔大学开发,是在BSD许可证下发布的开源项目,它是用一位希腊数学家的名字命名的。
Theano是一个Python库,可用于定义、优化和计算数学表达式,特别是多维数组(numpy.ndarray)。在解决包含大量数据问题的时候,使用Theano编程可实现比C语言编程更快的运行速度。通过GPU加速,Theano甚至可以比基于CPU计算的C语言快好几个数量级。
Theano结合 CAS(Computer Algebra System,计算机代数系统)和优化编译器,还可以为多种数学运算生成定制的C语言代码。对于处理包含重复计算的复杂数学表达式任务,计算速度很重要,因此这种CAS和优化编译器的组合非常有用。对于需要将每种不同的数学表达式都计算一遍的情况,Theano可以最小化编译/解析计算量,但仍会给出如自动微分那样的符号特征。
在过去很长一段时间里,Theano是深度学习开发与研究的行业标准。出身学界的Theano最初是为学术研究而设计的,这使得深度学习领域的许多学者至今仍在使用Theano。
但随着TensorFlow在谷歌的支持下强势崛起,Theano日渐式微,使用的人越来越少。其中标志性事件是Theano的创始者之一Ian GoodFellow放弃Theano转去谷歌开发TensorFlow了。
2017年9月28日,在Theano 1.0正式版发布前夕,LISA实验室负责人、深度学习三巨头之一的Yoshua Bengio宣布Theano将停止开发:“Theano is Dead.”
尽管Theano将退出历史舞台,但作为第一个Python深度学习框架,它很好地完成了自己的使命—为深度学习研究人员早期拓荒提供了极大的帮助,同时也为之后深度学习框架的开发奠定了基本设计方向:以计算图为框架的核心,采用GPU加速计算。
对于深度学习新手,可以使用Theano做入门练习,但对于职业开发者,建议使用 TensorFlow。
二、TensorFlow
TensorFlow是Google Brain团队基于Google在2011年开发的深度学习基础架构DistBelief构建的。Google在其所有的应用程序中都使用TensorFlow实现机器学习,例如使用Google照相机和Google语音搜索功能,就间接使用了TensorFlow模型。
TensorFlow在很大程度上可以看作Theano的后继者,这不仅因为它们有很大一批共同的开发者,还因为它们拥有相近的设计理念,都基于计算图实现自动微分系统。TensorFlow 使用数据流图进行数值计算,图中的节点代表数学运算,图中的边代表在这些节点之间传递的多维数组。
TensorFlow编程接口支持Python和C++,TensorFlow 1.0版本开始支持Java、Go、R和Haskell API的Alpha版本。此外,TensorFlow还可以在Google Cloud和AWS中运行。TensorFlow支持Windows 7、Windows 10和Windows Server 2016系统。
因为TensorFlow使用C++ Eigen库,所以可以在ARM架构上编译和优化。这也就意味着用户可以在各种服务器和移动设备上部署自己的训练模型,无须执行单独的模型解码器或者加载Python解释器。
作为当前最流行的深度学习框架,TensorFlow获得了极大的成功,但在学习过程中读者也需要注意下面一些问题。
因为TensorFlow的接口在不断地快速迭代,并且版本之间不兼容,所以在开发和调试过程中可能会出现问题,例如开源代码无法在新版的TensorFlow上运行。
想学习TensorFlow底层运行机制的读者需要做好心理准备,TensorFlow在GitHub代码仓库的总代码量超过100万行,系统设计比较复杂,这将是一个漫长的学习过程。
在代码层面,对于同一个功能,TensorFlow提供了多种实现,这些实现良莠不齐,使用中还有细微的区别,请读者注意选择。另外,TensorFlow创造了图、会话、命名空间、PlaceHolder等诸多抽象概念,对普通用户来说较难理解。
凭借Google强大的推广能力,TensorFlow已经成为当今最火的深度学习框架,不完美但是最流行。因为各公司使用的框架不统一,所以我们有必要多学习几个流行框架作为知识储备,TensorFlow无疑是一个不错的选择。
三、MXNet
MXNet是亚马逊首席科学家李沐带领团队开发的深度学习框架,拥有类似Theano和TensorFlow的数据流图,为多GPU架构提供了良好的配置,拥有类似Lasagne和Blocks的高级别模型构建块,可以在我们需要的任何硬件上运行(包括手机)。除了支持Python,MXNet同样提供了对 R、Julia、C++、Scala、Matlab、Go和Java的接口。
MXNet因其超强的分布式、内存/显存优化能力受到开发者的欢迎。同样的模型,MXNet往往占用的内存和显存更小,在分布式环境下,MXNet展现出了明显优于其他框架的扩展性能。
MXNet的缺点是推广力度不够、接口文档不完善。虽然MXNet版本快速迭代,但官方API文档却长时间未更新,导致新用户难以掌握新版本的MXNet,而老用户又需要查阅源码才能真正理解MXNet接口的用法。MXNet文档比较混乱,不太适合新手入门,但其分布性能强大,语言支持比较多,比较适合在云平台使用。
四、Keras
Keras是一个高层神经网络API,使用Python编写,并将TensorFlow、Theano及CNTK作为后端。Keras为支持快速实验而生,能够快速实现开发者的想法。Keras目前是最容易上手的深度学习框架,它提供了一致且简洁的API,能够极大减少一般应用下用户的工作量。
相比于深度学习框架,Keras更像是一个深度学习接口,它构建于第三方框架之上。Keras的缺点很明显:过度封装导致丧失了灵活性。Keras最初作为Theano的高级API,后来增加了TensorFlow和CNTK作为后端。
为了屏蔽后端的差异性,Keras提供了一致的用户接口并做了层层封装,导致用户在新增操作或是获取底层的数据信息时过于困难。同时,过度封装也使得Keras的程序运行十分缓慢,许多Bug都隐藏于封装之中。在绝大多数场景下,Keras是本文介绍的所有框架中运行最慢的。
学习Keras十分容易,但是很快就会遇到瓶颈,因为它不够灵活。另外,在使用Keras的大多数时间里,用户主要是在调用接口,很难真正学习到深度学习的内容。
Keras的过度封装使其并不适合新手学习(无法理解深度学习的真正内涵),故不推荐。
五、PyTorch
PyTorch是一个Python优先的深度学习框架,能够在强大的GPU加速基础上实现张量和动态神经网络。
PyTorch提供了完整的使用文档、循序渐进的用户指南,作者亲自维护PyTorch论坛,方便用户交流和解决问题。
Facebook人工智能研究院FAIR对PyTorch的推广提供了大力支持。作为当今排名前三的深度学习研究机构,FAIR的支持足以确保PyTorch获得持续开发、更新的保障,不至于像一些个人开发的框架那样昙花一现。如有需要,我们也可以使用Python软件包(如NumPy、SciPy和Cython)来扩展 PyTorch。
相对于TensorFlow,PyTorch的一大优点是它的图是动态的,而TensorFlow框架是静态图,不利于扩展。同时,PyTorch非常简洁,方便使用。本书选取PyTorch为主要的实现框架。
如果说TensorFlow的设计是“Make it complicated”,Keras的设计是“Make it complicated and hide it”,那么PyTorch的设计则真正做到了“Keep it simple,stupid”。
六、Caffe
Caffe是基于C++编写的深度学习框架,作者是贾扬清,源码开放(具有Licensed BSD)并提供了命令行工具以及Matlab和Python接口。
Caffe一直是深度学习研究者使用的框架,很多研究人员在上面进行开发和优化,因而有了不少沉淀,因此Caffe也是流行的深度学习框架之一。尽管如此,Caffe也存在不支持多机、跨平台、可扩展性差等问题。初学使用Caffe还需要注意下面两个问题。
Caffe的安装过程需要大量的依赖库,因此涉及很多安装版本问题,初学者须多加注意。
当用户要实现一个新的层,就需要用C++实现它的前向传播和反向传播代码,而如果想要新层运行在GPU上,则需要同时使用CUDA实现这一层的前向传播和反向传播。
Caffe2出自Facebook人工智能实验室与应用机器学习团队,贾杨清仍是主要贡献者之一。Caffe2在工程上做了很多优化,比如运行速度、跨平台、可扩展性等,它可以看作Caffe更细粒度的重构,但在设计上,Caffe2其实和TensorFlow更像。目前Caffe2代码已开源。
在工业界和学术界仍有很多人使用Caffe,而Caffe2的出现给我们提供了更多的选择。
关于作者:涂铭,资深数据架构师和人工智能技术专家,现就职于腾讯,曾就职于阿里。对大数据、自然语言处理、图像识别、Python、Java等相关技术有深入的研究,积累了丰富的实践经验。金智勇,计算机视觉算法专家,在计算机视觉领域深耕12年。现就职于百度,曾就职于阿里和三星等知名高新技术企业。业务领域涵盖增强现实、人脸识别、图像美化、智能交通、工业质检等多个方向,具有丰富的算法研究与落地经验。
本文摘编自《深度学习与目标检测:工具、原理与算法》,经出版方授权发布。(ISBN:9787111690344)