主流开源深度学习框架对比分析

 

1、Caffejavascript

(Convolutional Architecture for Fast Feature Embedding) BVLChtml

  We believe that Caffe is the fastest convnet implementation available. caffe的官网是http://caffe.berkeleyvision.org/。Caffe是一个清晰而高效的深度学习框架,其做者是博士毕业于UC Berkeley的贾扬清,目前在Google工做。java

  Caffe是纯粹的C++/CUDA架构,支持命令行、Python和MATLAB接口;能够在CPU和GPU直接无缝切换:Caffe::set_mode(Caffe::GPU); 在Caffe中图层须要使用C++定义,而网络则使用Protobuf定义。Caffe是一个深度卷积神经网络的学习框架,使用Caffe能够比较方便地进行CNN模型的训练和测试,精于CV领域。python

  Caffe做为快速开发和工程应用是很是适合的。caffe官方提供了大量examples,照着examples写,caffe只要求会写prototxt就行,它的训练过程、梯度降低算法等等都实现封装好了,懂了prototxt的语法了,基本就能本身构造神经网络了。caffe做为C++语言以及配合了CUDA开发的框架,训练效率也有保证,这也是caffe适合于工业应用的缘由。代码易懂好理解,高效、实用。上手简单,使用方便,比较成熟和完善,实现基础算法方便快捷,开发新算法不是特别灵活,适合工业快速应用实现.git

Caffe的优点:github

一方面是调参,改网络很方便,开源作得很好,另外一方面CNN在CV里用的不少,这也是Caffe的优点。web

上手快:配置文件简单,易上手,文档齐全,模型与相应优化都是以文本形式而非代码形式给出。算法

Caffe给出了模型的定义、最优化设置以及预训练的权重,方便当即上手。编程

速度快:Google Protocol Buffer数据标准为Caffe提高了效率,可以运行最棒的模型与海量的数据。Caffe与cuDNN结合使用,测试AlexNet模型,在K40上处理每张图片只须要1.17ms.数组

模块化:容许对新数据格式、网络层和损失函数进行扩展,方便扩展到新的任务和设置上。

可使用Caffe提供的各层类型来定义本身的模型。

开放性:公开的代码和参考模型用于再现。

社区好:能够经过BSD-2参与开发与讨论。

  学术论文采用此模型较多。很多论文都与Caffe有关(R-CNN,DSN,最近还有人用Caffe实现LSTM)

缺点:

灵活性差,不一样版本接口不兼容, 可定制性较低,不能很方便得扩展到其它模型。

  Caffe多是第一个主流的工业级深度学习工具,它开始于2013年末,具备出色的卷积神经网络实现。在计算机视觉领域Caffe依然是最流行的工具包,它有不少扩展,可是因为一些遗留的架构问题,它对递归网络和语言建模的支持不好。

2、MXNet

百度 DMLC(分布式机器学习社区) 简称"深盟"

内存优化作得好

  MXNet结合命令式和声明式编程的优势,既能够对系统作大量的优化,又能够方便调试。资源和计算的调度、内存分配资源管理、数据的表示、计算优化等都很值得学习的,原生支持分布式训练的。

  对于一个优秀的深度学习系统,或者更广来讲优秀的科学计算系统,最重要的是编程接口的设计。他们都采用将一个领域特定语言(domain specific language)嵌入到一个主语言中。例如numpy将矩阵运算嵌入到python中。这类嵌入通常分为两种,其中一种嵌入的较浅,其中每一个语句都按原来的意思执行,且一般采用命令式编程(imperative programming),其中numpy和Torch就是属于这种。而另外一种则用一种深的嵌入方式,提供一整套针对具体应用的迷你语言。这一种一般使用声明式语言(declarative programing),既用户只须要声明要作什么,而具体执行则由系统完成。这类系统包括Caffe,theano和TensorFlow。

这两种方式各有利弊,总结以下。

命令式编程:

如何执行 a=b+1: 须要b已经被赋值。当即执行加法,将结果保存在a中。

优势: 语义上容易理解,灵活,能够精确控制行为。一般能够无缝地和主语言交互,方便地利用主语言的各种算法,工具包,debug和性能调试器。

缺点: 实现统一的辅助函数和提供总体优化都很困难。

声明式编程:

如何执行 a=b+1: 返回对应的计算图(computation graph),咱们能够以后对b进行赋值,而后再执行加法运算

优势: 在真正开始计算的时候已经拿到了整个计算图,因此咱们能够作一系列优化来提高性能。实现辅助函数也容易,例如对任何计算图都提供forward和backward函数,对计算图进行可视化,将图保存到硬盘和从硬盘读取。

缺点: 不少主语言的特性都用不上。某些在主语言中实现简单,但在这里却常常麻烦,例如if-else语句 。debug也不容易,例如监视一个复杂的计算图中的某个节点的中间结果并不简单。

  目前现有的系统大部分都采用上两种编程模式的一种。与它们不一样的是,MXNet尝试将两种模式无缝的结合起来。在命令式编程上MXNet提供张量运算,而声明式编程中MXNet支持符号表达式。用户能够自由的混合它们来快速实现本身的想法。例如咱们能够用声明式编程来描述神经网络,并利用系统提供的自动求导来训练模型。另外一方便,模型的迭代训练和更新模型法则中可能涉及大量的控制逻辑,所以咱们能够用命令式编程来实现。同时咱们用它来进行方便地调式和与主语言交互数据。

下表咱们比较MXNet和其余流行的深度学习系统

框架         Caffe                    Torch                          Theano               TensorFlow                   MXNet

主语言     C++                        Lua                           Python                C++                                C++

从语言     Python, Matlab        x                              x                         Python                            Python, R, Julia, Scala, Javascript, Matlab, Go

硬件         CPU, GPU,        CPU, GPU, FPGA       CPU, GPU,         CPU, GPU, mobile         CPU, GPU,mobile

分布式     x                             x                               x                          v                                      v

命令式     x                             v                               v                          x                                      v

声明式     v                             x                               x                          v                                      v

Symbol: 声明式的符号表达式

  MXNet使用多值输出的符号表达式来声明计算图。符号是由操做子构建而来。一个操做子能够是一个简单的矩阵运算“+”,也能够是一个复杂的神经网络里面的层,例如卷积层。一个操做子能够有多个输入变量和多个输出变量,还能够有内部状态变量。一个变量既能够是自由的,咱们能够以后对其赋值;也能够是某个操做子的输出。在执行一个符号表达式前,咱们须要对全部的自由变量进行赋值。

NDArray:命令式的张量计算

  MXNet提供命令式的张量计算来桥接主语言的和符号表达式。另外一方面,NDArray能够无缝和符号表达式进行对接。

KVStore:多设备间的数据交互

  MXNet提供一个分布式的key-value存储来进行数据交换。它主要有两个函数,push: 将key-value对从一个设备push进存储,pull:将某个key上的值从存储中pull出来此外,KVStore还接受自定义的更新函数来控制收到的值如何写入到存储中。最后KVStore提供数种包含最终一致性模型和顺序一致性模型在内的数据一致性模型。

读入数据模块

  数据读取在总体系统性能上占重要地位。MXNet提供工具能将任意大小的样本压缩打包成单个或者数个文件来加速顺序和随机读取。

训练模块

  MXNet实现了经常使用的优化算法来训练模型。用户只须要提供数据数据迭代器和神经网络的Symbol即可。此外,用户能够提供额外的KVStore来进行分布式的训练。

过去,现状,和将来

  大半年数个优秀的C++机器学习系统的开发人员成立了DMLC,本意是更方便共享各自项目的代码,并给用户提供一致的体验。当时咱们有两个深度学习的项目,一个是CXXNet,其经过配置来定义和训练神经网络。另外一个是Minerva,提供相似numpy同样的张量计算接口。前者在图片分类等使用卷积网络上很方便,然后者更灵活。那时候咱们想能不能作一个二者功能都具有的系统,因而这样就有了MXNet。其名字来自Minerva的M和CXXNet的XNet。其中Symbol的想法来自CXXNet,而NDArray的想法来自Minerva。咱们也常把MXNet叫“mix net”。

  MXNet的目的是作一个有意思的系统,可以让你们用着方便的系统,一个轻量的和能够快速测试系统和算法想法的系统。将来主要关注下面四个方向:

  1. 支持更多的硬件,目前在积极考虑支持AMD GPU,高通GPU,Intel Phi,FPGA,和更多智能设备。相信MXNet的轻量和内存节省能够在这些上大有做为。
  2. 更加完善的操做子。目前不管是Symbol仍是NDArray支持的操做仍是有限,咱们但愿可以尽快的扩充他们。
  3. 更多编程语言。除了C++,目前MXNet对Python,R和Julia的支持比较完善。但咱们但愿还能有不少的语言,例如javascript。
  4. 更多的应用。咱们以前花了不少精力在图片分类上,下面咱们会考虑不少的应用。

3、Torch       Facebook  Google DeepMind  Twitter  FAIR

  核心的计算单元使用C或者cuda作了很好的优化。在此基础之上,使用lua构建了常见的模型。另外,torch7构建的是一个生态系统,安装新的模型实现模块只须要luarocks install package. 好比:luarocks install rnn。以后就能够欢乐地使用rnn模型了。torch7的缺点可能就是1. wrapper是lua语言,须要一点时间来学习。2. 优化新的计算单元可能会比较麻烦,backend修改起来会比较麻烦.

  核心特征的总结:

1. 一个强大的n维数组

2. 不少实现索引,切片,移调transposing的例程

3.惊人的经过LuaJIT的C接口

4.线性代数例程

5.神经网络,并基于能量的模型

6.数值优化例程

7.快速高效的GPU支持

8.可嵌入,可移植到iOS,Android和FPGA的后台

优点:

1. 构建模型简单,一层层搭积木便可。

2. 高度模块化,一层就是一个模块,写新模块也方便,套用接口就行,用tensor运算没必要写cuda也能用GPU。

3. 底层的tensor由C和cuda实现,速度不会比caffe差,甚至某些运算可能更快。

4. 使用GPU方便,把tensor数据送到GPU只要简单的 "tensor:cuda()"。

5. lua入门快,堪比python。

6. 很重要的一点,nngraph,理论上能够用nn里的模块实现任何DAG构造的网络,固然也包括RNN、LSTM之类的。

劣势:

1. 对于很多人来讲,lua要新学。

2. 除了deep learning方面,其余好用的机器学习library较少。

3. 数据文件格式比较麻烦,通常原始数据没有torch专用的t7格式文件,须要经过mat等格式中转转换。

 

4、Theano

     the LISA group at the University of Montreal(蒙特利尔)

  Theano是一个Python库,用来定义、优化和计算数学表达式,用于高效的解决多维数组的计算问题。

优势:

集成NumPy-使用numpy.ndarray

使用GPU加速计算-比CPU快140倍(只针对32位float类型)

有效的符号微分-计算一元或多元函数的导数

速度和稳定性优化-好比能计算很小的x的函数log(1+x)的值

动态地生成C代码-更快地计算

普遍地单元测试和自我验证-检测和诊断多种错误

灵活性好

缺点:

1.scan 中糟糕参数的传递限制,immutable 机制致使 function compile 时候的时间过长。

 2.theano 定义 function 时缺少灵活的多态机制。

3.困难的调试方法

5、TensorFlow

  Google

  TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学习系统,其命名来源于自己的运行原理。Tensor(张量)意味着N维数组,Flow(流)意味着基于数据流图的计算,TensorFlow为张量从图象的一端流动到另外一端计算过程。TensorFlow是将复杂的数据结构传输至人工智能神经网中进行分析和处理过程的系统。

  TensorFlow 表达了高层次的机器学习计算,大幅简化了第一代系统,而且具有更好的灵活性和可延展性。TensorFlow一大亮点是支持异构设备分布式计算,它可以在各个平台上自动运行模型,从电话、单个CPU / GPU到成百上千GPU卡组成的分布式系统。从目前的文档看,TensorFlow支持CNN、RNN和LSTM算法,拥有C++/Python编程接口,这都是目前在Image,Speech和NLP最流行的深度神经网络模型。

  TensorFlow的数据结构tensor,它至关于N维的array或者list,与MXNet相似,都是采用了以python调用的形式展示出来。某个定义好的tensor的数据类型是不变的,可是维数能够动态改变。用tensor rank和TensorShape来表示它的维数(例如rank为2能够当作矩阵,rank为1能够当作向量)。tensor是个比较中规中矩的类型。惟一特别的地方在于在TensorFlow构成的网络中,tensor是惟一可以传递的类型,而相似于array、list这种不能当成输入。

  TensorFlow的网络实现方式选择的是符号计算方式,它的程序分为计算构造阶段和执行阶段,构造阶段是构造出computation graph,computation graph就是包含一系列符号操做Operation和Tensor数据对象的流程图,跟mxnet的symbol相似,它定义好了如何进行计算(加减乘除等)、数据经过不一样计算的顺序(也就是flow,数据在符号操做之间流动的感受)。可是暂时并不读取输入来计算得到输出,而是由后面的执行阶段启动session的run来执行已经定义好的graph。这样的方式跟mxnet很类似,应该都是借鉴了theano的想法。其中TensorFlow还引入了Variable类型,它不像mxnet的Variable属于symbol(tf的operation相似mxnet的symbol),而是一个单独的类型,主要做用是存储网络权重参数,从而可以在运行过程当中动态改变。tf将每个操做抽象成了一个符号Operation,它可以读取0个或者多个Tensor对象做为输入(输出),操做内容包括基本的数学运算、支持reduce、segment(对tensor中部分进行运算。

TensorFlow的优势:

一、TensorFlow则是功能很齐全,可以搭建的网络更丰富而不是像caffe仅仅局限在CNN。

二、 TensorFlow的深度学习部分可以在一个模型中堆积了许多不一样的模型和转换,你可以在一个模型中方便地处理文本 图片和规则分类以及连续变量,同时实现多目标和多损失工做;

三、TensorFlow的管道部分可以将数据处理和机器学习放在一个框架中,TensorFlow指引了方向。

  TensorFlow是一个理想的RNN(递归神经网络) API和实现,TensorFlow使用了向量运算的符号图方法,使得新网络的指定变得至关容易,但TensorFlow并不支持双向RNN和3D卷积,同时公共版本的图定义也不支持循环和条件控制,这使得RNN的实现并不理想,由于必需要使用Python循环且没法进行图编译优化。

6、CNTK      微软深度学习工具包  

  微软将人工智能成果 CNTK 开源放上 GitHub,称是运算速度最快的 Toolkit

  是一个统一的深度学习工具包,它将神经网络描述成在有向图上的一系列计算步骤。在这个有向图中,叶子结点表示输入层或网络参数,其它的结点表示成在输入层上的矩阵操做。在CNTK上能够很容易的实现及结合当今流行的模型,例如前馈神经网络DNNs, 卷积神经网络(CNNs), 循环神经网络 (RNNs/LSTMs)。在实现随机梯度降低学习时可以自动计算梯度,并且还能经过多个GPUs或服务器实现并行计算。CNTK是微软在Cortana 数字助理和Skype 翻译应用中使用的语音识别的系统框架。

  CNTK最大的优势是能够并行多个GPU或服务器。微软首席科学家黄学东说“谷歌公开的TensorFlow并无这个功能”。

  CNTK的另一个优势是支持Microsoft Windows。可是这个开源工具是用C++写的。微软计划将尽快公开对应的Python和C#版本。

主流开源深度学习框架对比分析

 

 

 

 

十个值得尝试的开源深度学习框架

 

  本周早些时候开源中国社区公布了Google开源了TensorFlow(GitHub)消息,此举在深度学习领域影响巨大,由于Google在人工智能领域的研发成绩斐然,有着雄厚的人才储备,并且Google本身的Gmail和搜索引擎都在使用自行研发的深度学习工具。

 

  无疑,来自Google军火库的TensorFlow必然是开源深度学习软件中的明星产品,登录GitHub当天就成为最受关注的项目,当周得到评星数就轻松超过1万个。

  对于但愿在应用中整合深度学习功能的开发者来讲,GitHub上其实还有不少不错的开源项目值得关注,首先咱们推荐目前规模人气最高的TOP3:

 

Caffe

  源自加州伯克利分校的Caffe被普遍应用,包括Pinterest这样的web大户。与TensorFlow同样,Caffe也是由C++开发,Caffe也是Google今年早些时候发布的DeepDream项目(能够识别喵星人的人工智能神经网络)的基础。

 

Theano

  2008年诞生于蒙特利尔理工学院,Theano派生出了大量深度学习Python软件包,最著名的包括BlocksKeras

 

Torch

  Torch诞生已经有十年之久,可是真正起势得益于去年Facebook开源了大量Torch的深度学习模块和扩展。Torch另一个特殊之处是采用了不怎么流行的编程语言Lua(该语言曾被用来开发视频游戏)。

 

  除了以上三个比较成熟知名的项目,还有不少有特点的深度学习开源框架也值得关注:

Brainstorm

  来自瑞士人工智能实验室IDSIA的一个很是发展前景很不错的深度学习软件包,Brainstorm可以处理上百层的超级深度神经网络——所谓的公路网络Highway Networks

 

Chainer

来自一个日本的深度学习创业公司Preferred Networks,今年6月发布的一个Python框架。Chainer的设计基于define by run原则,也就是说,该网络在运行中动态定义,而不是在启动时定义,这里有Chainer的详细文档

 

Deeplearning4j

顾名思义,Deeplearning4j是”for Java”的深度学习框架,也是首个商用级别的深度学习开源库。Deeplearning4j由创业公司Skymind于2014年6月发布,使用 Deeplearning4j的不乏埃森哲、雪弗兰、博斯咨询和IBM等明星企业。

DeepLearning4j是一个面向生产环境和商业应用的高成熟度深度学习开源库,可与Hadoop和Spark集成,即插即用,方便开发者在APP中快速集成深度学习功能,可应用于如下深度学习领域:

人脸/图像识别

语音搜索

语音转文字(Speech to text)

垃圾信息过滤(异常侦测)

电商欺诈侦测

 

Marvin

是普林斯顿大学视觉工做组新推出的C++框架。该团队还提供了一个文件用于将Caffe模型转化成语Marvin兼容的模式。

 

ConvNetJS

  这是斯坦福大学博士生Andrej Karpathy开发浏览器插件,基于万能的JavaScript能够在你的游览器中训练神经网络。Karpathy还写了一个ConvNetJS的入门教程,以及一个简洁的浏览器演示项目

  github主页:https://github.com/karpathy/convnetjs

 

MXNet

  出自CXXNet、Minerva、Purine等项目的开发者之手,主要用C++编写。MXNet强调提升内存使用的效率,甚至能在智能手机上运行诸如图像识别等任务。

 

Neon

  由创业公司Nervana Systems于今年五月开源,在某些基准测试中,由Python和Sass开发的Neon的测试成绩甚至要优于Caffeine、Torch和谷歌的TensorFlow。

 

6642:  iNaturalist(项目:链接天然)挑战2017数据集

1707- 06436:  将来的计算机视觉调查--经过对2016年的1600篇论文的调研

6342: ThiNet:一个滤波器级别的调谐方法用于深度网络压缩

6292: STag:一个基准的标记系统