对比深度学习十大框架:TensorFlow 并不是最好?

http://www.oschina.net/news/80593/deep-learning-frameworks-a-review-before-finishing-2016html

TensorFlow

连接:https://www.tensorflow.org/git

对于那些据说过深度学习但尚未太过专门深刻的人来讲,TensorFlow 是他们最喜欢的深度学习框架,但在这里我要澄清一些事实。程序员

在 TensorFlow 的官网上,它被定义为「一个用于机器智能的开源软件库」,但我以为应该这么定义:TensorFlow 是一个使用数据流图(data flow graphs)进行数值计算的开源软件库。在这里,他们没有将 TensorFlow 包含在「深度学习框架」范围内,而是和 Theano 一块儿被包含在「图编译器(graph compilers)」类别中。github

在结束了 Udacity 的 Deep Learning 课程(https://www.udacity.com/course/deep-learning--ud730)以后,个人感受是 TensorFlow 是一个很是好的框架,可是却很是低层。使用 TensorFlow 须要编写大量的代码,你必须一遍又一遍地从新发明轮子。并且我并非惟一一个这么想的人。Andrej Karpathy 在 Twitter 上就屡次吐过槽:算法

推文:我但愿 TensorFlow 能标准化咱们的代码,但它是低层面的,因此咱们在其上面的层上分道扬镳了:Slim、PrettyTensor、Keras、TFLearn ...编程

好比:咱们在 OpenAI 使用 TensorFlow,但咱们彷佛都更喜欢其它框架,咱们有些人还写自定义代码。叹后端

几个月前,我去参加了「Google Experts Summit: TensorFlow, Machine Learning for everyone, with Sergio Guadarrama」。Sergio 是开发 TensorFlow 的一位工程师,但他在会上没有展现 TensorFlow,而是展现了一个在 TensorFlow 上工做的更高层的库 tf.contrib:https://www.tensorflow.org/tutorials/tflearn/。个人见解是:他们内部已经意识到若是要让更多人使用 TensorFlow,他们就须要以更高的抽象水平在其上建立一些层,从而简化 TensorFlow 的使用。网络

TensorFlow 支持 Python 和 C++,也容许在 CPU 和 GPU 上的计算分布,甚至支持使用 gRPC 进行水平扩展。架构

总结:TensorFlow 很是好,但你必须了解它好在哪里。若是你不想什么事都本身手动去作和从新发明轮子,你可使用更简单的库(安利一下 Keras)。框架

Theano

连接:http://deeplearning.net/software/theano/

Theano 是最老牌和最稳定的库之一。据我所知,深度学习库的开端不是 Caffe 就是 Theano。

和 TensorFlow 相似,Theano 是一个比较低层的库。也所以它并不适合深度学习,而更适合数值计算优化。它支持自动的函数梯度计算,带有 Python 接口并集成了 Numpy,这使得它从一开始就成为了通用深度学习领域最常使用的库之一。

今天,Theano 依然效果良好,但因为它不支持多 GPU 和水平扩展,在 TensorFlow 的热潮下(它们针对同一个领域),Theano 已然开始被遗忘了。

Keras

连接:https://keras.io/

「You have just found Keras.」

上面这句话是你打开文档页面时看到的第一句话。我还记得我第一次发现 Keras 的时候。那时候我正在柏林解决 Data Science Retreat 的最后一个项目,为此我努力进入了深度学习库的世界。我在起步时就已经有了足够的深度学习知识,但我没有时间本身手动编写功能,也没有时间探索和学习一个新的库(截止时间不到 2 个月,而我还有课要上)。而后我发现了 Keras。

我真的很喜欢 Keras,由于它的句法是至关明晰的,它的文档也很是好(尽管相对较新),并且它支持我已经掌握的语言 Python。它的使用很是简单轻松;咱们也能很直观地了解它的指令、函数和每一个模块之间的连接方式。

Keras 是一个很是高层的库,能够工做在 Theano 和 TensorFlow(能够配置)之上。另外,Keras 强调极简主义——你只需几行代码就能构建一个神经网络。在这里你能够比较一下 Keras 和 TensorFlow 实现相同功能时所需的代码:https://gist.github.com/ricgu8086/0ba44ce3aab19ec50425383a4d778b50

Lasagne

连接:http://lasagne.readthedocs.io/en/latest/index.html

Lasagne 是一个工做在 Theano 之上的库。它的使命是简化一点深度学习算法之下的复杂计算,同时也提供了一个更加友好的接口(也是 Python 的)。这是一个老牌的库,而且很长时间以来它都是一个扩展能力很强的工具;但在我看来,它的发展速度赶不上 Keras。它们的适用领域都差很少,但 Keras 有更好的文档、也更完整。

Caffe

连接:http://caffe.berkeleyvision.org/

Caffe 不仅是最老牌的框架之一,而是老牌中的老牌。

在我看来,Caffe 有很是好的特性,但也有一些小缺点。起初的时候它并非一个通用框架,而仅仅关注计算机视觉,但它具备很是好的通用性。在咱们实验室的实验中,CaffeNet 架构的训练时间在 Caffe 中比在 Keras 中(使用了 Theano 后端)少 5 倍。Caffe 的缺点是它不够灵活。若是你想给它来一点新改变,那你就须要使用 C++ 和 CUDA 编程,不过你也可使用 Python 或 Matlab 接口进行一些小改变。

Caffe 的文档很是贫乏。你须要花大量时间检查代码才能理解它(Xavier 初始化有什么用?Glorot 是什么?)

Caffe 的最大缺点之一是它的安装。它须要解决大量的依赖包……我曾经安装过 Caffe 两次,真正痛苦至极。

但要清楚,Caffe 并非一无可取。在投入了生产的计算机视觉系统的工具上,Caffe 是无可争议的领导者。它很是稳健很是快速。个人建议是:用 Keras 进行实验和测试,而后迁移到 Caffe 中进行生产。

DSSTNE

连接:https://github.com/amznlabs/amazon-dsstne

DSSTNE 的发音同 Destiny,是一个酷劲十足的框架却老是被忽略。为何?除去其余的因素不谈,缘由在于这个框架不具备普适性,不是为通常常见任务所设计的。DSSTNE 框架只作一件事——推荐系统,但把这件事作到了极致。既不是为研究而设计,也不是为测试 idea 而设计(来源其官方网站的宣传语),DSSTNE 框架是为量产而设计。

咱们已在 BEEVA 上作一些实验测试了,目前我已经感受到这是一个运行很是快的工具而且可以获得很是好的运行结果(平均准确率均值——mAP 很高)。为了达到这一速度,DSSTNE 框架用 GPU 运行,这也是它的弊端之一:不一样于篇中分析的其余框架或者库,这个框架不支持使用者随意在 CPU 和 GPU 中切换,而这可能会对有些尝试有用,但咱们在 DSSTNE 里作这样的尝试时是不被框架所容许的。

其余的感觉就是迄今为止 DSSTNE 还不是一个足够成熟的项目,并且它封装的太严密了(「black box」)。若是咱们想深刻了解这个框架的运行机制是什么,咱们必须且只能去看它的源码,而且你须要完成不少必须完成的设置(「TODO」)才能够看到。同时,关于这个框架的在线教程很少,而能让开发者进行操做尝试的指导就更少了。个人意见是再等 4 个月看看 DSSTNE 的最新版本。不能不说 DSSTEN 的确是一个颇有意思的项目但还须要一点成长空间。

还想说明一点,这个框架对编程能力没有要求。DSSTNE 框架经过其终端的命令行来执行相关操做。

到目前为止,不少我知道也很流行的框架和库我尚未用过,我不能给出更多具体的细节。

Torch

连接:http://torch.ch/

在这个世界上天天仍有不少战争,可是一个优秀的「勇士」(西班牙语「Guerrero」)必须熟知哪些战争是须要去参加做战的,哪些是能够选择不参与的。

Torch 是一个很著名的框架,因巨头 Facebook 的人工智能研究所用的框架是 Torch,而且在被谷歌收购以前 DeepMind 也是用的 Torch(收购以后 DeepMind 转向了 TensorFlow)。Torch 的编程语言是 Lua,这就是我刚才所谈的「战争」的具体所指。在目前深度学习编程语言绝大部分以 Python 实现为主的大趋势下,一个以 Lua 为编程语言的框架的最大劣势莫过于此。我从未用使用过这个语言,若是我想使用 Torch 这个工具,毫无疑问我须要先学习 Lua 语言而后才能使用 Torch。这当然是一个合理的过程,但就我我的状况来讲,我偏向于用 Python、Matlab 或者 C++的实现。

MXNet

连接:https://github.com/dmlc/mxnet

mxnet 是一个支持大多数编程语言的框架之一,包括 Python,R,C++,Julia 等。但我以为使用 R 语言的开发者会特别偏心 mxnet,由于至今为止仍是 Python 以不可置疑的态势称霸深度学习语言的(Python 与 R 的对决,猜猜我会站哪边?:-p)

老实说,在此以前我并无很关注 mxnet。可是当亚马逊 AWS 宣布选择 mxnet 做为其深度学习 AMI 的库时触发我开始关注 mxnet。我必须去了解一下。后来我获知亚马逊把 mxnet 列为其深度学习的参考库并宣称其巨大的横向扩展能力。我感受到这里面有一些新的改变发生并且我必须深刻了解。这也是为何咱们 2017 的 BEEVA 的技术测试名单里有 mnxet 的缘由。

我对多 GPU 的扩展能力有点疑虑而且我很原意去了解这样实验的更多细节,但目前我仍是对 mxnet 持怀疑态度。

DL4J

连接:https://deeplearning4j.org/

我接触这一库,是由于它的 documentation。当时我正在寻找受限玻尔兹曼机、自编码器,在 DL4J 中找到了这两个 documentation。里面的文件很清楚,有理论,有代码案例。我必须得说 DL4J 的 documentation 简直是艺术品,其余库在记录代码的时候须要向它学习。

DL4J 背后的公司 Skymind 意识到,虽然在深度学习圈内 Python 是老大,但大部分程序员起自 Java,因此须要找到一个解决方案。DL4J 兼容 JVM,也适用 Java、Clojure 和 Scala,随着 Scala 的起起落落,它也被不少有潜力的创业公司使用,因此我还会继续紧追这个库。

此外,Skymind 的 twitter 帐户很是活跃,不断公开最新的科学论文、案例和教程,及其推荐你们关注。

Cognitive Toolkit

连接:https://github.com/Microsoft/CNTK

认知工具包(Cognitive Toolkit)以前被你们所知的缩略是 CNTK,可是最近又重命名回归到 Cognitive Toolkit,极可能是想沾最近微软认知服务(Microsoft Cognitive services)的光。在公开的基准测试上的表现来看,这个工具彷佛很强劲,支持纵向和横向的推移。

目前为止,Cognitive Toolkit 彷佛不是很流行。我并无读到不少关于使用这个库的博客、在线实验案例或者在 Kaggle 里的相关评论。可是对我来讲,一个背靠微软研究的框架特别强调本身的推移能力让我以为有些奇怪,毕竟微软研究团队但是在语音识别上打破世界纪录并逼近人类水准。

我在查看他们项目百科的一个范例的时候了解到 Cognitive Toolkit 在 Python 上的语法和 Keras 是很是相相似的(Cognitive Toolkit 也支持 C++),这不由让我在想(并非确认)Keras 才是正确的方式。

结论

个人结论是:若是你想进入这一领域,你应该首先学习 Python。尽管这一领域还支持其它不少语言,但 Python 是应用范围最广并且最简单的一个。可是为何要选择 Python 呢——毕竟 Python 速度这么慢?由于大多数的库都使用的是符号式语言(symbolic language)方法而非命令式语言(imperative language)方法。解释一下也就是说:不是一条接一条地执行你的指令,而是根据你给出的全部指令建立一个计算图(computing graph)。这个图被内部优化和编译成可执行的 C++ 代码。这样你就能同时利用上两个世界的最优之处:Python 带来的开发速度和 C++ 带来的执行速度。

人们对深度学习的兴趣愈来愈大了,但人们并不肯意等待算法训练所需的大量计算时间(并且我说的是 GPU,想都不要想只使用 CPU)。这也是多 GPU 支持、多机器上的水平扩展甚至定制硬件最近开始得势的缘由。

深度学习领域很是活跃、易变。极可能我如今所说的在 2017 年的中旬就变了。

个人建议是,若是你是初学者,使用 Keras,若是不是初学者,也可使用它。若是你参加过 Kaggle 比赛,你确定注意到了 Kaggle 的两大巨星:Keras 和 XGBoost。

原文连接:https://medium.com/@ricardo.guerrero/deep-learning-frameworks-a-review-before-finishing-2016-5b3ab4010b06#.z8zuthuwm

编译:机器之心

本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区。
转载请注明:文章转载自 开源中国社区 [http://www.oschina.net]
本文标题:对比深度学习十大框架:TensorFlow 并不是最好?
相关文章
相关标签/搜索