主流深度学习框架汇总与对比

想要学习深度学习,就要掌握一个有效的深度学习框架。那么现在都有哪些主流的深度学习开源框架,它们各自的优/缺点又是什么呢?

在工程实践中,我们认为,要选择一个得心应手的深度学习框架,主要从框架的流行程度和应用场景出发。

  • 对想要入门深度学习的用户来说,选择一个比较流行的框架意味着能从多种渠道中获得更多的支持,譬如书籍、博客、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 Google PythonC++、 Java、 Go Linux、macOS、 Windows 、 Raspberry Pi 符号式编程
Keras 37850 14450 771 Google Python、 R Linux、macOS、 Windows 符号式编程
PyTorch 24331 5778 906 Facebook 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

(0)
上一篇 2021年7月20日
下一篇 2021年7月20日

相关推荐

发表回复

登录后才能评论