2.3 深度学习框架简介

通过下图我们可以看到,主流的深度学习框架种类还是非常多的。

下面我们来了解一下这张排行榜。这张排行榜的作者是Keras的作者、谷歌研究科学家François Chollet,他在三月份时晒出了一张图,他基于Google Search Index,展示了过去三个月,ArXiv上提到的深度学习框架排行。

从这张排行榜中我们可以看到,TensorFlow是最受欢迎的,其次是Keras,之后是Caffe、PyTorch等等。我们选择其中几个来了解一下。

> Theano

Theano的开发始于2007年,由加拿大的蒙特利尔大学开发。由于出身学界,它最初是为学术研究而设计的,在过去的很长一段时间内,Theano是深度学习开发与研究的行业标准。

Theano是一个比较低层的库,适合数值计算优化。支持自动的函数梯度计算,带有Python接口并集成了Numpy,可以说Theano是Python的一个数值计算库。但它也有些缺陷,它不支持多GPU和水平扩展。

随着TensorFlow在谷歌的支持下强势崛起,Theano日渐式微,这过程中的标志性事件是:创始者之一的Ian Goodfellow放弃Theano转去谷歌开发TensorFlow。

> Caffe

Caffe在2013年就已问世,是老牌的框架之一,它的创始人是加州大学伯克利分校的中国籍博士生贾扬清先生。

Caffe的全称是“Convolutional Architecture For Feature Extraction”,意为“用于特征提取的卷积架构”,它的设计初衷是为了计算机视觉。但它也存在灵活性不足的问题,为模型做调整常常需要用到C++和CUDA。

在2017年4月Facebook发布了Caffe2,Caffe2可以看作是Caffe更细粒度的重构,在实用的基础上,增加了扩展性和灵活性。

> PyTorch

在讲PyTorch之前,我们先来了解一下Torch。

Torch是一个非主流的深度学习框架,它的开发语言是基于20世纪90年代诞生于巴西的Lua,而现在主流的机器学习界所采用的语言,基本上都是Python,因此,用Lua显得有些“非主流”。

Facebook的人工智能研究所使用的框架就是Torch。Torch非常适用于卷积神经网络,它的灵活度更高,因为它是命令式的,所以支持动态图模型。

大多数的深度学习框架都是支持静态图模型的,也就是说,它要先把模型定义好,然后再进行运行计算,而Torch的灵活度更高,它可以像交互式的命令一样,边运行边更改,在运行的过程中去定义它的图模型,这样叫做动态图模型。

2017年初,Facebook在Torch的基础上,针对Python语言发布了一个全新的机器学习工具包PyTorch。PyTorch可以说是Torch的Python版,增加了很多新的特性。

2018年4月,Facebook宣布Caffe2将正式将代码并入PyTorch。

> MXNet

MXNet是亚马逊AWS选择支持的深度学习框架。

MXNet尝试将两种模式无缝的结合起来:在命令式编程上,MXNet提供张量运算,而声明式编程中MXNet支持符号表达式。这样,用户可以自由地混合它们来快速实现自己的想法,也就是说,它结合了静态定义计算图和动态定义计算图的优势。

MXNet支持C++、Python、R、Julia、Go语言,但是它的学习难度较高。

> CNTK

Microsoft 认知工具包(Cognitive Toolkit) 之前被大家所知的缩略是CNTK。

2016年,微软宣布已经在GitHub上向外部开发人员开源其人工智能工具包CNTK(Computational Network Toolkit)。

CNTK工具包中的语音和图像识别速度比较快,而且它还具有着更为强大的可扩展性——开发者可以用多台计算机实现GPU的扩展,从而能够更加灵活地应对大规模的实验。对于广大Windows系列的开发者来说,它支持C#是一个非常好的福音。

> Keras

Keras是一个非常高层的库,可以工作在Theano、TensorFlow和CNTK之上。

Keras强调极简主义——你只需要几行代码就能构建一个神经网络。它是为支持快速实验而生,能够把你的idea迅速转换为结果。它的句法相当明晰,文档也非常好,同时也支持Python。

> DL4J

DL4J(Deep Learning For Java)是基于JVM、聚焦行业应用且提供商业支持的分布式深度学习框架,其宗旨是在合理的时间内解决各类涉及大量数据的问题。

它对Java的支持就是它最大的特点。它可以与Hadoop和Spark集成,可使用任意数量的GPU或CPU运行。这就为广大的Java从业人员提供了一个好的深度学习工具。

> Chainer

Chainer是一个专门为高效研究和开发深度学习算法而设计的开源框架。它也是基于Python的独立的深度学习框架。

Chainer在训练时,“实时”构建计算图,“边运行边定义”的方法使构建深度学习网络变得灵活简单,也就是说,它支持动态图定义。

这种方法可以让用户在每次迭代时或者说对每个样本都可以根据条件更改计算图,同时也很容易使用标准调试器和分析器来调试和重构基于Chainer的代码。

> Paddle Paddle

Paddle Paddle是百度旗下深度学习开源平台。

Paddle(Parallel Distributed Deep Learning,并行分布式深度学习)。

2016年9月1日百度世界大会上,百度首席科学家Andrew Ng(吴恩达)首次宣布将百度深度学习平台对外开放,命名PaddlePaddle。有趣的是,Andrew Ng认为Paddle Paddle比Paddle更容易被大家所记住,后来事实证明也的确如此。

2016年9月27日,Paddle Paddle在开源社区GitHub以及百度大脑平台开放。

百度资深科学家、Paddle Paddle研发负责人徐伟介绍:“在PaddlePaddle的帮助下,深度学习模型的设计如同编写伪代码一样容易,设计师只需关注模型的高层结构,而无需担心任何琐碎的底层问题。未来,程序员可以快速应用深度学习模型来解决医疗、金融等实际问题,让人工智能发挥出最大作用。”

> TensorFlow

“A machine learning platform for everyone to solve real problems”,即对每个人来解决现实问题的机器平台,这也是TensorFlow存在的宗旨。

它不仅在上层支持神经网络,它还很全面的支持其他机器学习的算法,比如K-Means、决策树、支持向量机等等。它对语言的支持也很多,比如Python、C++、Java等等。此外,在硬件层面,它也可以支持CPU、GPU、TPU、Mobile(移动平台上)等等。

TensorFlow还提供了一个叫做TensorBoard的可视化工具(图2-29),这个工具非常强大,它可以基于运行的一些日志文件,可视化的把模型训练和结果展现出来。包括计算图可视化(图2-30),里面一些精确度、损失率都可以很好的可视化出来,方便用户对模型的调优。

此外,TensorFlow提供了不同层次的接口,从低层到高层。越低层越灵活、越容易去控制,而越高层越容易使用。最低层的就是TensorFlow直接提供的低层接口。

我们这门课大多数都是基于这一层的接口来讲解应用开发的,因为它能够比较好的去反映TensorFlow的一些设计理念以及深度学习的一些原理。虽然它很底层,但是它的调用并不是很困难,还是很容易去理解的。

当然,为了初学者更好地去使用,它还提供了Keras这个高层的接口。在它上面的是Estimator,Estimator支持分布式地执行。再上面就是一些预设好的模型库,这些模型库可以由用户直接拿来使用(开箱即用)。

TensorFlow支持多种开发语言,除了前面提到过的一部分,下图中也列举了其他的发开语言,不同的软件发开人员都可以找到TensorFlow的支持。

TensorFlow.js我们在后面中也会有例子来讲解,它可以直接利用JavaScript在网页上进行机器学习的训练和使用。

TensorFlowLite使得在PC上或者在服务器上训练好的TensorFlow的模型,可以通过转换,变成TensorFlowLite的格式,去支持移动端的应用,比如安卓、ios、树莓派之类的,使得移动的人工智能变为现实。

Last updated