在工程实践中,我们认为,要选择一个得心应手的深度学习框架,主要从框架的流行程度和应用场景出发。
- 对想要入门深度学习的用户来说,选择一个比较流行的框架意味着能从多种渠道中获得更多的支持,譬如书籍、博客、GitHub 项目等;
- 对专门从事深度学习模型开发的用户来说,选择一个适合应用场景的框架,使用一门合适的开发语言,将会使模型开发达到事半功倍的效果。
下面介绍现在主流的深度学习开源框架,帮助读者对这些框架有直观的认识。
主流的深度学习开源框架
这是一个深度学习框架群雄逐鹿的年代,许多深度学习框架在涌现、合并,抑或凋零,其中包括 TensorFlow、Keras、CNTK、PyTorch、MXNet、Theano 等,它们的背后是 Google、Microsoft、Facebook、Amazon 等科技巨头。
就目前的情况来看:
- 在 Google 的号召下,TensorFlow 拥有众多的开发者,在关注度和用户数上都占据绝对优势。
- Keras 作为“框架上的框架”,以其易用性吸引了不少支持者。
- Facebook 的 PyTorch、Amazon 的 MXNet、Microsoft 的 CNTK 等各有一技之长,在目前深度学习的战场上立有一席之地。
- 而曾经的霸主 Theano,在没有大公司的支持下,开始没落。
对准备入门深度学习的人来说,深度学习框架在 GitHub上的活跃度可以作为一个重要的参考指标。在 GitHub 上,被 Star(收藏)和 Fork(分支)越多,意味着有越多的开发者选择了这个深度学习框架。
我总结了在 GitHub上(到 2019-02-01 为止)各个主流深度学习框架的活跃度,以及它们对编程语言和系统的支持情况,如下表所示。
框架名称 | GitHub的活跃度 | 维护团队 | 支持语言 | 支持系统 | 编程模式 | ||
---|---|---|---|---|---|---|---|
Star (数量) | Fork (数量) | 贡献者数量 | |||||
TensorFlow | 119730 | 71727 | 1817 | Python、C++、 Java、 Go | Linux、macOS、 Windows 、 Raspberry Pi | 符号式编程 | |
Keras | 37850 | 14450 | 771 | Python、 R | Linux、macOS、 Windows | 符号式编程 | |
PyTorch | 24331 | 5778 | 906 | Python、C++ | Linux、macOS、 Windows | 命令式编程 | |
MXNet | 16255 | 5842 | 667 | DMLC、 Amazon | Python、C++、 Clojure、Julia、 Perl、R、Scala、 Java | Linux、macOS、 Windows、Raspberry Pi、NVIDIA Jetson | 符号式编程和命令式编程的混合编程 |
CNTK | 15721 | 4213 | 191 | Microsoft | Python、C++、 C#/.NET、Java | Linux、Windows | 符号式编程 |
Theano | 8667 | 2479 | 334 | 蒙特利尔 大学 | Python | Linux、macOS、Windows | 符号式编程 |
从深度学习开源框架统计表中,我们可以看到:
1) TensorFlow 处于毫无疑问的霸主地位,其 Star 数和 Fork 数均超过了表中其他开源框架的 Star 数和 Fork 数的总和。
2) 在对语言的支持上,Python 为最受欢迎的语言,所有框架均支持 Python 或者 Python 优先。Python 的优雅、简洁,使得其具有较低的使用门槛和极高的编程效率,能够更快地尝试不同的参数组合以及更复杂的模型。
C++ 排名第二,除 Theano 和 Keras 外,其他深度学习框架底层都是由 C/C++ 语言编写的,保证了模型训练的速度和效率。
其他语言支持的框架各有不同,譬如 TensorFlow 支持Go语言、MXNet 支持 Scala 语言、CNTK 支持 C# 语言等。
3) 在支持的系统上,所有框架基本都支持 Linux、macOS 和 Windows 这3个主流系统(除 CNTK 缺少对 macOS 的原生支持外),TensorFlow 和 MXNet 还支持 Raspberry Pi(树莓派),MXNet 还支持 NVIDIA Jetson。
4) 在编程模式上,Theano、TensorFlow、CNTK、Keras 为符号式编程;PyTorch 为命令式编程;MXNet 比较特殊,支持符号式编程和命令式编程的混合编程。
【答疑解惑】编程模式与计算图
编程模式通常分为命令式编程(imperative style programs)和符号式编程(symbolic style programs)。
符号式编程
符号式编程将计算过程抽象为计算图。使用计算图可以方便地描述计算过程,所有输入节点、运算节点、输出节点均被符号化处理。计算图通过建立输入节点到输出节点的传递闭包,从输入节点出发,沿着传递闭包完成数值计算和数据流动,直到输出节点。
这个过程经过计算图优化,以数据流方式完成,节省了内存空间,计算速度快,但不适合程序调试。
因为符号式编程中的计算图先定义后执行(define and run),也被称为静态计算图。
命令式编程
命令式编程就是输入什么便执行什么,在运行语句时马上进行计算,对语句基本没有优化,按原有逻辑执行,容易理解和调试。命令式编程在运行过程中定义(define by run)的计算图,是动态计算图。
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/23439.html