首页 > 编程笔记

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

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

在工程实践中,我们认为,要选择一个得心应手的深度学习框架,主要从框架的流行程度和应用场景出发。
下面介绍现在主流的深度学习开源框架,帮助读者对这些框架有直观的认识。

主流的深度学习开源框架

这是一个深度学习框架群雄逐鹿的年代,许多深度学习框架在涌现、合并,抑或凋零,其中包括 TensorFlow、Keras、CNTK、PyTorch、MXNet、Theano 等,它们的背后是 Google、Microsoft、Facebook、Amazon 等科技巨头。

就目前的情况来看:
对准备入门深度学习的人来说,深度学习框架在 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)的计算图,是动态计算图。

所有教程

优秀文章