前言
选择什么样的深度学习框架一直是开发者很是关心的一个话题,并且深度学习框架之间的「战争」也愈来愈激烈。随着近几年AI的火热,愈来愈多的出现有关各个机器学习框架的对比文章,且随着 Python 逐渐成为机器学习社区最受欢迎的语言,支持 Python的深度学习框架的性能也在持续的被关注。前端
因为本身想了解下机器学习,随机查阅了诸多文献给予此,将横向的对比如下深度学习框架和工具的特色:python
Theanoweb
Lasagne算法
Blocks编程
TensorFlow后端
Keras数组
MXNet网络
PyTorch架构
Caffe框架
CNTK
Neon
开始以前,先来介绍下几个名词:
卷积神经网络(Convolutional Neural Network,CNN)
CNN是一种前馈神经网络,它的人工神经元能够响应一部分覆盖范围内的周围单元,且该网络避免了对图像的复杂前期预处理,能够直接输入原始图像,对于大型图像处理有出色表现。主要用来识别位移、缩放及其余形式扭曲不变性的二维图形,因为CNN的特征检测层是经过训练数据进行学习的,因此在使用CNN时,避免了显式的特征抽取,而是隐式地从训练数据中进行学习;再者因为同一特征映射面上的神经元权值相同,因此网络能够并行学习,这也是卷积网络相对于神经元彼此相连网络的一大优点。卷积神经网络以其局部权值共享的特殊结构在语音识别和图像处理方面有着独特的优越性,其布局更接近于实际的生物神经网络,权值共享下降了网络的复杂性,特别是多维输入向量的图像能够直接输入网络这一特色避免了特征提取和分类过程当中数据重建的复杂度。
递归神经网络(Recurrent neural Network,RNN)
RNN神经网络是一种节点定向链接成环的人工神经网络。网络的内部状态能够展现动态时序行为。不一样于前馈神经网络的是,RNN能够利用它内部的记忆来处理任意时序的输入序列,这让它能够更容易处理如不分段的手写识别、语音识别等。具备更强的动态行为和计算能力。
NumPy(Numeric Python)
一个用Python实现的科学计算包,是Python的一种开源数值计算扩展,包括:一、一个强大的N维数组对象Array;二、比较成熟的(广播)函数库;三、用于整合C/C++和Fortran代码的工具包;四、实用的线性代数、傅里叶变换和随机数生成函数。提供了许多高级的数值编程工具,可用来存储和处理大型矩阵,如矩阵数据类型、矢量处理、以及精密的运算库,是专为进行严格的数字处理而产生。基本能够认为NumPy将Python变成了一种免费的更强大的MatLab系统。
简介
Theano
Theano 是一个Python 库,容许你定义、优化而且有效地评估涉及到多维数组的数学表达式。
Theano 是数值计算的主力,它支持了许多其余的深度学习框架。Theano由 Frédéric Bastien建立,这是蒙特利尔大学机器学习研究所(MILA)背后的一个很是优秀的研究团队。它的API 水平较低,而且为了写出效率高的Theano,须要对隐藏在其余框架幕后的算法至关的熟悉。若是有着丰富的学术机器学习知识,正在寻找模型的精细控制方法,或者想要实现一个新奇的或不一样寻常的模型,Theano是首选库。为了灵活性,Theano牺牲了易用性。
优势:灵活,正确使用时的高性能。
缺点:较高的学习难度,低水平的 API,编译复杂的符号图可能很慢。
Lasagne
在 Theano上创建和训练神经网络的轻量级库。
由于 Theano致力于成为符号数学中最早且最好的库,Lasagne提供了在 Theano顶部的抽象,这使得它更适合于深度学习。它主要由当前 DeepMind研究科学家 Sander Dieleman编写并维护。Lasagne并不是是根据符号变量之间的函数关系来指定网络模型,而是容许用户在层级思考,为用户提供了例如「Conv2DLayer」和「DropoutLayer」的构建块。Lasagne在牺牲了不多的灵活性的同时,提供了丰富的公共组件来帮助图层定义、图层初始化、模型正则化、模型监控和模型训练。Theano+Lasagne是不少一线开发者的最爱。
优势:仍旧很是灵活,比 Theano更高级的抽象,文档和代码中包含了各类 Pasta Puns。
缺点:社区小。
Blocks
用于构建和训练神经网络的 Theano框架。
与 Lasagne相似,Blocks 是在 Theano 顶部添加一个抽象层使深度学习模型比编写原始的 Theano更清晰、更简单、定义更加标准化。它是由蒙特利尔大学机器学习研究所(MILA)编写,其中一些人为搭建Theano 和第一个神经网络定义的高级接口(已经淘汰的PyLearn2)贡献了本身的一份力量。比起Lasagne,Blocks灵活一点,代价是入门台阶较高,想要高效的使用它有不小的难度。除此以外,Blocks对递归神经网络架构(recurrent neural network architectures)有很好的支持,因此若是有兴趣探索这种类型的模型,它值得一看。
优势:仍旧很是灵活,比 Theano更高级的抽象,易于测试。
缺点:较高的学习难度,更小的社区。
TensorFlow
用于数值计算的使用数据流图的开源软件库。
TensorFlow 是较低级别的符号库(好比 Theano)和较高级别的网络规范库(好比Blocks 和Lasagne)的混合。虽然它是Python 深度学习库集合的最新成员,不过在Google Brain 团队支持下,它已是最大的活跃社区了。它支持在多GPUs 上运行深度学习模型,为高效的数据流水线提供使用程序,并具备用于模型的检查,可视化和序列化的内置模块。且TensorFlow支持 Keras(一个很优秀的深度学习库)。
优势:由软件巨头 Google支持,很是大的社区,低级和高级接口网络训练,比基于 Theano配置更快的模型编译,彻底地多 GPU支持。
缺点:虽然 Tensorflow正在追赶,可是在许多基准上比基于 Theano的慢,RNN支持仍不如 Theano。
Keras
Python 的深度学习库。支持Convnets(基于GPU实现的卷积神经网络)、递归神经网络等。在Theano 或者TensorFlow 上运行。
Keras 也许是水平最高,对用户最友好的库了。由 Francis Chollet(Google Brain团队中的另外一个成员)编写和维护。它容许用户选择其所构建的模型是在 Theano上或是在 TensorFlow上的符号图上执行。Keras的用户界面受启发于 Torch。因为部分很是优秀的文档和其相对易用性,Keras的社区很是大而且很是活跃。TensorFlow已经与 Keras一块儿支持内置,因此很快 Keras将是 TensorFlow项目的一个分组。
优势:可供选择的 Theano或者 TensorFlow后端,直观、高级别的端口,更易学习。
缺点:不太灵活。
MXNet
MXNet 是一个旨在提升效率和灵活性的深度学习框架。
MXNet 是亚马逊(Amazon)选择的深度学习库,也许是最优秀的库。它拥有相似于Theano 和TensorFlow 的数据流图,架构设计得能够利用更多内存复用机会和为多GPU 配置提供了良好的配置,有着相似于Lasagne 和Blocks 更高级别的模型构建块,而且能够在你能够想象的任何硬件上运行(包括手机)。对Python 的支持只是其冰山一角——MXNet一样提供了对 R、Julia、C++、Scala、Matlab和Javascript 的接口。
优势:速度的标杆,很是灵活。
缺点:最小的社区,比 Theano更高的学习难度。
PyTorch
Python 中的张量(Tensors)和动态神经网络,有着强大的GPU 加速。
PyTorch 也是Python 深度学习框架列表中的一个新成员。它是从Lua 的Torch 库到Python 的松散端口,由Facebook 的人工智能研究团队(Artificial Intelligence Research team (FAIR))支持且由于它较早支持用于处理动态计算图,也是很是优秀的一款深度学习框架。
优势:来自 Facebook 组织的支持,彻底地对动态图的支持,高级和低级API 的混合。
缺点:比其余选择,PyTorch还不太成熟,除了官方文档之外,只有有限的参考文献/资源。
Caffe
Caffe 起初并非一个通用框架,而仅仅关注计算机视觉,但它具备很是好的通用性。
Caffe 具备很好的 CNN建模能力,可是 RNN资源就少不少,因此它更多的是面向图像识别、推荐引擎和天然语言识别等方向的应用,不面向其余深度学习应用诸如语音识别、时间序列预测、图像字幕和文本等其余须要处理顺序信息的任务。
优势:良好的CNN建模能力。
缺点:不够灵活,有限的参考文献/资源。
CNTK
CNTK 是微软的开源深度学习框架,是「Computational Network Toolkit(计算网络工具包)」的缩写。或是另外一种称呼认知工具包(Cognitive Toolkit)。虽然也是强大的工具,可是社区小,文献资源和相关评论也是不多。
优势:丰富的 RNN教程和预构建模型。
缺点:社区小,新手级资料少。
Neon
Neon是Intel收购的一个深度学习框架,所以在Intel处理器架构平台性能至关好,且具备良好的CNN 建模能力。至于其余方面就逊色许多。
优势:较好的 CNN建模能力和Intel架构出色的性能。
缺点:社区小,新手级资料少。
对比
教程和资源
各种深度学习框架的教程与可利用的资源在质量和数量上有着显著的不一样。
TensorFlow,MXNet,PyTorch和Theano有着很详尽的文档教程,与此相比,虽然微软的CNTK 和英特尔的Nervana Neon 也是强大的工具,却不多能见到有关它们的新手级资料。
语言和平台
毫无疑问,python是目前机器学习语言的趋势。
MXNet(Python、R、Scala、Julia、Matlab、Javascript、C++)与TensorFlow(python、C/C++)具备丰富的多语言支持。
多平台的支持首属MXNet(跨平台Linux、OS X、Windows、Android、iOS),Theano跨平台,TensorFlow暂时不支持Windows。
架构和速度
训练深度网络很是耗时,因此为在特定框架中构建和训练新模型,易于使用和模块化的前端是相当重要的。TensorFlow,PyTorch和 MXNet都有直观而模块化的架构,让开发相对变得简单。另外,由于有 TensorBoard web GUI等应用的存在,TensorFlow极易在训练中和训练后进行 debug和监控。
Caffe 也发布了一些预训练模型/权重(model zoo),可以做为初始权重被用于特殊领域或自定义图像的迁移学习或微调深度网络。可以转换基于caffe 的预训练模型权重,使其能够适应MXNET。
至于速度则须要考虑每一个深度学习的框架所针对的领域了,RNN性能比较出色的有CNTK和 PyTorch,CNN性能比较出色的有Theano,Caffe和MXNet。另外Theano和MXNet在综合性能中是比较出色的,Tensorflow的性能在大多数测试中也是颇有竞争力的。
多GPU和Keras兼容性
大多数深度学习应用都须要用到巨量的浮点运算(FLOP),了减小构建模型所需的时间,须要使用多 GPU并联的方式组建本身的学习平台。根据公开发表的文献,MXNet有着最好的多 GPU优化引擎,这也是其综合性能中比较出色的缘由之一。另外TensorFlow和PyTorch对多GPU也有很好的支持。
基于Theano的深度学习框架(Lasagne)和 Keras是深度学习模型中较早且较普遍使用的框架,很容易用 Lasagne/Keras 实现新网络或者编辑现存网络。且Keras是一个用于快速构建深度学习原型的高级库,是数据科学家应用深度学习的好帮手,目前兼容Keras的只有Theano和TensorFlow。
CNN 建模能力
卷积神经网络(CNN)常常被用于图像识别、推荐引擎和天然语言识别等方向的应用。CNN由一组多层的神经网络组成,在运行时会将输入的数据进行预约义分类的评分。CNN也可用于回归分析,例如构成自动驾驶汽车中有关转向角的模型。评价一种框架的 CNN建模能力考虑如下几个特性:定义模型的机会空间、预构建层的可用性、以及可用于链接这些层的工具和功能。其中Theano,Caffe和MXNet都有很好的 CNN建模能力。另外,TensorFlow由于易于创建的 Inception V3模型,PyTorch 由于其丰富的 CNN 资源(易于使用的时间卷积集)使得这两种框架在 CNN 建模能力上脱颖而出。
RNN 建模能力
循环神经网络(RNN)经常使用于语音识别,时间序列预测,图像字幕和其余须要处理顺序信息的任务。目前,Microsoft的 CNTK和 PyTorch 有着丰富的 RNN教程和预构建模型。另外,目前很流行的 TensorFlow中也有一些 RNN 资源,且Keras中更是有不少使用 TensorFlow的 RNN 示例。
高级支持和扩展
主要考虑低级的张量(Tensor)运算符和控制流运算符的支持程度,高效的低级运算符实现能充当新模型的原料,控制流运算符增长符号引擎的表达性和通用性,这方面表现良好的主要是Theano和TensorFlow。
基于Theano的架构库能够说是最多的,Keras、Lasagne、blocks就是成功的案例。而TensorFlow是较低级别的符号库(好比Theano)和较高级别的网络规范库(好比Blocks 和Lasagne)的混合,且兼容Keras,良好的设计使得图像、队列、图像增长器等能成为更高级包装的有用构造块。
总结
语言和平台的支持:
MXNet:真正的跨平台,语言支持丰富。
Theano:跨平台Win、Linux、Mac,语言Python。
TensorFlow:Linux、Mac,语言Python、C、C++。
PyTorch:Linux、Mac,Python、Lua
教程和资源的比较:
TensorFlow、Theano、MXNet、PyTorch。
架构和扩展的比较:
Theano、TensorFlow、PyTorch、MXNet。
CNN建模能力的比较:
Caffe、MXNet、Theano,TensorFlow、PyTorch。
RNN建模能力的比较:
CNTK、PyTorch、TensorFlow、MXNet。
多GPU支持:
MXNet、TensorFlow、PyTorch、Theano。
综合性能:
MXNet、Theano、TensorFlow、PyTorch。
对比 框架 |
语言和平台 |
教程和资源 |
架构和扩展 |
Theano |
Python/ Win、Linux、Mac |
++++ |
+++++ |
TensorFlow |
Python、C、C++/ Linux、Mac |
+++++ |
+++++ |
MXNet |
Python、R、Scala、Julia、Matlab、Javascript、C++/ 跨平台 |
+++ |
+++ |
PyTorch |
Python、Lua/ Linux、Mac |
+++ |
+++ |
Caffe |
C++/ Linux、Mac |
+ |
+ |
CNTK |
C++/ Win、Linux |
+ |
+ |
Neon |
Python/ Linux、Mac |
+ |
+ |
注:Theano、Lasagne、Blocks在此处统一列为Theano项。
Keras是在 Theano或者 TensorFlow上运行的。
续表
对比 框架 |
多GPU支持 |
RNN建模能力 |
CNN建模能力 |
综合性能 |
Theano |
++ |
++ |
+++ |
+++ |
TensorFlow |
+++ |
++ |
++ |
+++ |
MXNet |
++++ |
+++ |
++++ |
++++ |
PyTorch |
++ |
+++ |
++ |
++ |
Caffe |
+ |
|
++++ |
++ |
CNTK |
+ |
++++ |
+ |
++ |
Neon |
+ |
++ |
++ |
++ |