【TensorFlow实战——笔记】第2章:TensorFlow和其他深度学习框架的对比

2.1 主流深度学习框架对比

各个开源框架在Github上的数据统计

数据统计截止于2017.07.15

可以看到各大主流框架基本都支持Python,目前Python在科学计算和数据挖掘领域可以说是独领风骚。虽然有来自R、Julia等语言的竞争压力,但是Python的各种库实在是太完善了,Web开发、数据可视化、数据预处理、数据库连接,爬虫等无所不能,有一个完美的生态环境。仅在数据挖掘工具链上,Python就有Numpy、SciPy、Pandas、Scikit-learn、XGBoost等组件,做数据采集和预处理都非常方便,并且之后的模型训练阶段可以和TensorFlow等基于Python的深度学习框架完美衔接。

主流深度学习框架在各个维度的评分

各基础深度学习框架在AlexNet上的性能对比

数据来源于:

https://github.com/soumith/convnet-benchmarks

AlexNet (One Weird Trick paper) - Input 128x3x224x224

2.2 各深度学习框架简介

== TensorFlow ==

Github源码地址:

https://github.com/tensorflow/tensorflow

TensorFlow是由核心代码C++编写,提供的接口除了C++外,还有官方的Python、Go、Java接口,是通过SWIG(Simplified Wrapper and Interface Generator)实现的,这样用户就可以在硬件配置较好的机器中用Python进行实验,并在资源比较紧张的嵌入式环境或需要低延时的环境中使用C++部署模型

非官方接口地址如下:

Julia: https://github.com/malmaud/TensorFlow.jl Node.js https://github.com/node-tensorflow/node-tensorflow R: https://github.com/rstudio/tensorflow

TensorFlow内置TF.Learn和TF.Slim等上层组件可以帮助快速设计新网络,并兼任Scikit-learn estimator接口,方便实现evaluate、grid search、cross validation等功能。不局限于神经网络,数据流式图可以轻松实现深度学习以外的机器学习算法。

在数据并行模式上,类似Parameter Server,但是TensorFlow有自己独立的Variable node,不像其他框架有一个全局的参数服务器,因此参数同步更自由。和Spark一样都是数据计算的流式图。

灵活的移植性,同份代码基本不需修改就可以轻松部署到任意数据CPU、GPU的PC、服务器或移动设备上。编译速度快。有强大的可视化组件TensorBoard。

TensorFlow除了支持常见的网络结构卷积神经网络(Convolutional Neural Network, CNN)、循环神经网络(Recurent Neural Network, RNN)外,还支持深度强化学习乃至其他计算密集的科学计算(如偏微分方程求解等)。

TensorFlow的用户可将训练好的模型方便地部署到多种硬件、操作系统平台上,支持Intel和AMD的CPU,通过CUDA支持NVIDIA的GPU,通过OpenCL支持AMD的GPU,支持Linux、Mac和Windows。在CPU上的矩阵运算库使用了Eigen而不是BLAS库,能够基于ARM架构编程和优化,因此在移动设备上表现得很好。

目前在单GPU条件下,绝大多数深度学习框架都依赖于cuDNN。对于大规模深度学习来说,巨大的数据量使得单机很难在有限时间完成训练。这时需要使用GPU集群乃至TPU集群并行运算。目前TensorFlow分布式的通信使用基于socket的RPC,而不是速度更快的RDMA,分布式性能可能还没达到最优。

TensorFlow Serving

Google在2016年2月开源了TensorFlow Serving,这个组件可以将TensorFlow训练好的模型导出,并部署成可以对外提供预测服务的RESTful接口。内部开发人员描述:“TensorFlow Serving是一个为生产环境而设计的高性能的机器学习服务系统。它可以同时运行多个大规模深度学习模型,支持模型生命周期管理、算法实验,并可以高效地利用GPU资源,让TensorFlow训练好的模型更快捷方便地投入到实际生产环境”。

TensorBoard

TensorBoard是TensorFlow的一组Web应用。支持5种可视化:

  • 标量(scalars)
  • 图片(images)
  • 音频(audio)
  • 直方图(histograms)
  • 计算图(Computation Graph)

== Caffe ==

Github源码地址:

https://github.com/BVLC/caffe

Caffe全称为Convolutional Architecture for Fast Feature Embedding,在TensorFlow出现前,一直是最火的深度学习框架。其优势如下:

  • 容易上手,网络结构都是以配置文件形式定义,不需要用代码设计网络
  • 训练速度快,能够训练state-of-the-art的模型与大规模的数据
  • 组件模块化,可以方便拓展新的模型和学习任务

Caffe的核心概念是Layer,每一个神经网络的模块都是一个Layer。每一个Layer需要定义两种运算,一种是正向(forward)的运算,即从输入数据计算输出结果,也就是模型的预测过程;另一种是反向(backward)的运算,从输出端的gradient求解相对于输入的gradient,即相反传播算法,这部分就是模型的训练过程。

Caffe最开始设计时的目标只是针对于图像,没有考虑文本、语音或时间序列的数据。所以Caffe对卷积神经网络支持非常好,但对于时间序列RNN 、LSTM等支持的不是特别充分。同时,基于Layer的模式也对RNN不是非常友好,定义RNN结构时比较麻烦。

Caffe一大优势是拥有大量训练好的经典模型(AlexNet、VGG、Inception)乃至其他的state-of-the-art(ResNet等)。因为Caffe的底层基于C++,因此可以在各种硬件环境编译并具有良好的移植性,支持Linux、Mac和Windows系统,也可以编译部署到移动设备。

== Theano ==

Github源码地址:

https://github.com/Theano/Theano

Theano诞生于2008年,因为出现早,可算是这类库的始祖之一,也一度被认为是深度学习研究和应用的重要标准之一。Theano的核心是一个数学表达式的编译器,专门为处理大规模神经网络训练的计算而设计。其优势如下:

  • 集成NumPy,可以直接用NumPy的ndarray,API接口学习成本低
  • 计算稳定性好,比如可以精确地计算输出值很小的函数(像log(1+x))
  • 动态地生成C或者CUDA代码,用以编译成高效的机器代码

Theano更多地被当做一个研究工具,而不是当作产品来使用。虽然支持Linux、Mac和Windows,但是没有底层C++的接口,因此模型部署非常不方便。

== Torch7 ==

Github源码地址:

https://github.com/torch/torch7

Torch给自己的定位是LuaJIT上的一个高效的科学计算库,支持大量的机器学习算法,同时以GPU上的计算优先。Torch的目标是让设计科学计算算法变得便捷,它包含了大量的机器学习、计算机视觉、信号处理、并行运算、图像、视频、音频、网络处理的库,同时和Caffe类似,Torch拥有大量训练好的深度学习模型。

它和TensorFlow一样使用了底层C++加上层脚本语言调用的方式,只不过Torch使用的是Lua。Lua支持Linux和Mac,还支持各种嵌入式系统(iOS、Android、FPGA等),只不过运行时还是必须有LuaJIT的环境,所以工业生产环境的使用相对较少。

Torch提供的各种数据处理的库

== Lasagne ==

Github源码地址:

https://github.com/Lasagne/Lasagne

Lasagne是一个基于Theano的轻量级的神经网络库。它支持前馈神经网络,比如卷积网络、循环神经网络、LSTM等,以及它们的组合;支持许多优化方法,比如Nesterovmomentum、RMSprop、ADAM等;它是Theano的上层封装,但又不像Keras那样进行了重度的封装,Keras隐藏了Theano中所有的方法和对象,而Lasagne则是借用了Theano中很多的类,算是介于基础的Theano和高度抽象的Keras之间的轻度封装。

== Keras ==

Github源码地址:

https://github.com/fchollet/keras

Keras是一个崇尚极简、高度模块化的神经网络库,使用Python实现,并可以同时运行在TensorFlow和Theano上。Keras专精于深度学习。它提供了目前为止最方便的API,用户只需要将高级的模块拼在一起,就可以设计神经网络,它大大降低了编程开销(code overhead)和阅读别人代码的理解开销(cognitive overhead)。

Keras最大的问题可能是目前无法直接使用多GPU,所以对大规模的数据处理速度没有其他支持多GPU和分布式的框架快。

== MXNet ==

Github源码地址:

https://github.com/dmlc/mxnet

MXNet是DMLC(Distributed Machine Learning Community)开发的一款开源的、轻量的、可移植的、灵活的深度学习库,它让用户可以混合使用符号编程模式和指令式编程模式来最大化效率和灵活性,目前已经是AWS官方推荐的深度学习框架。MXNet的很多作者都是中国人,其最大的贡献组织为百度。它是各个框架中率先支持多GPU和分布式的,同时其分布式性能也非常高。

MXNet的核心是一个动态的以来调度器,支持自动将计算任务并行化到多个GPU或分布式集群。一个很大的优点就是支持非常多的语言封装,比如C++、Python、R、Julia、Scala、Go、MATLAB和Javascript等。

== DIGITS ==

Github源码地址:

https://github.com/NVIDIA/DIGITS

DIGITS(Deep Learning GPU Training System)不是一个标准的深度学习库,它可以算是一个Caffe的高级封装(或者Caffe的Web版培训系统)。因为封装得非常重,以至于你不需要(也不能)在DIGITS中写代码,即可实现一个深度学习的图片识别模型。

DIGITS把所有操作都简化在浏览器中执行,可以算是Caffe在图片分类上的一个漂亮的用户可视化界面(GUI),计算机视觉的研究者或者工程师可以方便的设计深度学习模型、测试准确率,以及调试各种超参数。同时使用它也可以生成数据和训练结果的可视化统计报表,甚至是网络的可视化结构图。

== CNTK ==

Github源码地址:

https://github.com/Microsoft/CNTK

CNTK(Computational Network Toolkit)是微软研究院(MSR)开源的深度学习框架。目前在语言识别领域的使用尤为广泛。CNTK通过一个有向图将神经网络描述为一系列的运算操作,这个有向图中子节点代表输入或网络参数,其他节点代表各种矩阵运算。

CNTK支持各种前馈网络,包括MLP、CNN、RNN、LSTM、Sequence-to-Sequence模型等,也支持自动求解梯度。拥有产品级的代码质量,支持多机、多GPU的分布式训练。

CNTK通过写配置文件的方式定义网络结构,还支持Python、C++和C#语言绑定,这样用户就可以用编程的方式设计网络结构。

CNTK原生支持多GPU和分布式,从官网公布的对比测试来看,性能非常不错。在GPU方面,CNTK相对于其他深度学习库表现得更突出,它实现了1-bit SGD和自适应的mini-batching。CNTK是唯一支持单机8块GPU的框架,并且在分布式系统中可以超越8块GPU的性能。

== Deeplearning4J ==

Github源码地址:

https://github.com/deeplearning4j/deeplearning4j

Deeplearning4J(简称DL4J)是一个基于Java和Scala的开源的分布式深度学习库。其核心目标是创建一个即插即用的解决方案原型。可以方便的与Hadoop及Spark自动整合,同时可以方便地在现有集群(包括但不限于AWS,Azure等)上进行扩展。此外,DL4J还有商业版的支持。

== Chainer ==

Github源码地址:

https://github.com/chainer/chainer

Chainer是由日本公司Preferred Networks于2015年6月发布的深度学习框架。特征描述如下:

  • Powerful:支持CUDA计算,只需要几行代码就可以使用GPU加速,同时只需少改动就可以运行在多GPU上
  • Flexible:支持多种前馈神经网络,包括卷积网络、循环网络、递归网络,支持运行中动态定义的网络(Define-by-Run)
  • Intuitive:前馈计算可以引入Python的各种控制流,同时反向传播时不受干扰,简化了调试错误的难度

== Leaf ==

Github源码地址:

https://github.com/autumnai/leaf

Leaf是一个基于Rust语言的直观的跨平台的深度学习乃至机器智能框架,它拥有一个清晰的架构,除了同属Autumu AI的底层计算库Collenchyma,Leaf没有其他依赖库。可移植性非常好,可以运行在CPU、GPU和FPGA等设备上,可以支持任何操作系统的PC、服务器,甚至是没有操作系统的嵌入式设备,并且同时支持OpenCL和CUDA。

== DSSTNE ==

Github源码地址:

https://github.com/amzn/amazon-dsstne

DSSTNE(Deep Scalable Sparse Tensor Network Engine)是亚马逊开源的稀疏神经网络框架,在训练非常稀疏的数据时具有很大的优势。目前只支持全连接的神经网络,不支持卷积网络等。和Caffe类似,它也是通过写一个JSON类型的文件定义模型结构,但是支持非常大的Layer(输入和输出节点都非常多)。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏量子位

Google发布tf.Transform,让数据预处理更简单

为了方便用户为机器学习进行数据预处理,Google今天发布了tf.Transform。 以下内容来自Google Research Blog,量子位编译 每当要...

4239
来自专栏数据派THU

怎样构建中文文本标注工具?(附工具、代码、论文等资源)

来源:Paperweekly 本文长度为2218字,建议阅读4分钟 本文为你介绍中文文本标注工具的构建方法,并提供多个开源文本标注工具。 项目地址: https...

1.2K7
来自专栏悦思悦读

【机器学习实践】水果图片分类

学习理论之外,自己寻找资源动手实践,在实际做项目中巩固了习得的理论知识,并进一步体会到了日常积累的重要性。

6293
来自专栏ATYUN订阅号

2018年7月机器学习开源项目TOP 10

在过去的一个月里,Mybridge AI根据各种因素对项目进行排名,在将近250个机器学习开源项目中选出前10位。

1072
来自专栏PPV课数据科学社区

【学习】R语言中的情感分析与机器学习

#玩转大数据#利用机器学习可以很方便的做情感分析。本篇文章将介绍在R语言中如何利用机器学习方法来做情感分析。在R语言中,由Timothy P.Jurka开发的情...

3748
来自专栏机器之心

教程 | 如何使用TensorFlow实现音频分类任务

7457
来自专栏机器学习算法与Python学习

干货 | 数据挖掘知识点整理

关键字全网搜索最新排名 【机器学习算法】:排名第一 【机器学习】:排名第二 【Python】:排名第三 【算法】:排名第四 1. 数据、信息和知识是广义数据表...

3207
来自专栏新智元

【李飞飞团队最新研究】神经任务编程NTP,具有强大泛化能力的机器人学习框架

【新智元导读】斯坦福大学计算机视觉实验室李飞飞团队的最新研究提出一个新的机器人学习框架:神经任务编程(NTP),在机械臂的物品堆叠、分拣和桌面清理三类任务中,证...

3818
来自专栏专知

【AlphaGo Zero 核心技术-深度强化学习教程代码实战03】编写通用的格子世界环境类

【导读】Google DeepMind在Nature上发表最新论文,介绍了迄今最强最新的版本AlphaGo Zero,不使用人类先验知识,使用纯强化学习,将价值...

3004
来自专栏MixLab科技+设计实验室

TensorFlow.js、迁移学习与AI产品创新之道

TensorFlow 的 JS 版本终于出啦,deeplearn.js 正式收编至 TensorFlow 项目,并改名为 TensorFlow.js :

91510

扫码关注云+社区

领取腾讯云代金券