第 1 章 初识TensorFlow

第 1 章 初识TensorFlow

2016年3月,Google的围棋人工智能程序AlphaGo以4∶1的大比分战胜人类选手李世石,又在2017年5月,以3∶0的比分战胜人类排名第一的围棋选手柯洁,在全球引起广泛关注,掀起了一波人工智能的热潮。其实,在我们普通人的平时生活中,从智能手机的语音助手,到相机的人脸识别,人工智能已经悄悄融入我们的生活,未来也将更加深刻影响我们的生活。

早在2015年11月9日,为加速深度学习的发展,Google发布了深度学习框架TensorFlow并宣布将其开源。在短短两年的时间内,在GitHub上,TensorFlow就成为了最流行的深度学习项目。

TensorFlow在图形分类、音频处理、推荐系统和自然语言处理等场景下都有丰富的应用。虽然TensorFlow开源时间才两年,但是它正在以迅猛的速度渗入到我们的平常生活中,并且在各种不同领域得到广泛的应用。

在澳大利亚,海洋生物学家与来自昆士兰大学的计算机科学家合作,利用TensorFlow,使用探测器自动在数以万计的航拍照片中寻找海牛;在日本,一位年轻人将TensorFlow运用到农业上,按照大小、形状、颜色以及其他特征来挑选黄瓜并对它们进行分类;在医学领域,放射科的医生采用TensorFlow,在医学扫描中能够识别帕金森病的迹象。湾区的数据科学家在树莓派上使用TensorFlow来追踪记录加州火车的动态。最近,AlphaGo开发团队DeepMind也声称,将从Torch迁移到TensorFlow中。这些无不印证了TensorFlow在业界的流行程度。

1.1 TensorFlow特点

那么,TensorFlow到底有什么特点,能让它在这么短的时间内得到如此广泛的应用呢?

首先,TensorFlow作为一个支持深度学习的计算框架,支持Linux、Windows、Mac,以及各种移动平台。其次,TensorFlow提供了非常丰富的深度学习相关的API,可以说是目前所有深度学习框架里提供API最全的,不止包括基本的向量矩阵计算、各种优化算法、卷积神经网络和循环神经网络基本单元的实现,以及可视化的辅助工具,还有很多最新进展的算法库都会及时更新。更重要的是,TensorFlow有谷歌的大力支持,还有开源世界的无数贡献者给TensorFlow及其生态系统添砖加瓦。

TensorFlow的特点如下。

  • 高度灵活性。TensorFlow不仅仅是一个深度学习库,只要可以把计算过程表示成一个数据流图的过程,就可以用它来计算。TensorFlow允许我们用计算图的方式建立计算网络,同时又可以很方便地对网络进行操作(关于计算图的相关内容,第3章会有详细的介绍)。用户可以基于TensorFlow用Python编写自己的上层结构和库,如果TensorFlow没有提供需要的API,也可以自己编写底层的C++代码,通过自定义操作将新编写的功能添加到TensorFlow中。
  • 真正的可移植性。TensorFlow可以在台式计算机中的一个或多个CPU(或GPU)、服务器、移动设备等上运行。你想在笔记本上跑一下深度学习的训练,或者不想修改代码,想把你的模型在多个CPU上运行,亦或想将训练好的模型放到移动设备上跑一下,这些TensorFlow都可以做到。
  • 多语言支持。TensorFlow采用非常易用的Python来构建和执行计算图,同时也支持C++、Java、Go语言。我们可以直接写Python和C++程序来执行TensorFlow,也可以采用交互式的IPython来方便地尝试我们的想法。当然,这只是一个开始,后续会支持更多流行的语言,比如Lua、JavaScript或者R语言。
  • 丰富的算法库。TensorFlow提供了所有开源深度学习框架里最全的算法库,并且还在不断添加新的算法库。这些算法库基本上已经满足了大部分需求,对于普通的应用,基本上不用自己再去自定义基本的算法库了。
  • 完善的文档。TensorFlow官方网站提供了非常详细的文档介绍,既包括各种API的使用介绍和各种基础应用的使用例子,也包括一部分深度学习的基础理论,不过这些都是英文的。
  • 大量的开源项目。TensorFlow在GitHub上的主项目下还有类似models这样的项目,里面包含了许多应用领域的最新研究算法的代码实现,比如图像识别领域效果最好的Inception网络和残差网络,能够让机器自动用文字描述一张图片的应用im2txt项目,自然语言某些处理领域达到人类专家水平的syntaxnet项目,等等。对于TensorFlow的使用者,可以很方便地借鉴这些已经实现的高质量的项目,快速构建自己的深度学习应用。

自从宣布开源以来,已经超过1100人对TensorFlow做出贡献,其中包括Google员工、外部研究人员和独立程序员。全球各地的工程师对TensorFlow的完善,已经让TensorFlow变成了GitHub上最活跃的深度学习框架。

1.2 其他深度学习框架

除了TensorFlow,还有很多其他的深度学习框架,各个框架都有各自的优缺点,并不是说某一个框架就比其他框架好。这里只做简单介绍,方便大家有个全面的了解。

1.2.1 Caffe

Caffe的全称是Convolution Architecture For Feature Extraction,它是第一个在工业上得到广泛应用的开源深度学习框架,也是第一代深度学习框架里最受欢迎的框架。

Caffe是C++/CUDA架构,支持命令行、Python和MATLAB接口,支持CPU/GPU,其优势如下。

  • 上手快。模型与相应优化都是以文本形式而非代码形式给出的。Caffe给出了模型的定义、最优化设置以及预训练的权重,方便立即上手。
  • 速度快。能够运行最棒的模型与海量的数据。Caffe与cuDNN结合使用,执行速度快。
  • 模块化。方便扩展到新的任务和设置上。可以使用Caffe提供的各层类型来定义自己的模型。
  • 社区好。很长一段时间都是最受欢迎的深度学习框架,有很大一批用户,有大批的用户讨论和贡献,在平时的一些论文中也会看到很多实现是基于Caffe框架的,并且Caffe的设计也影响了它之后的很多框架。

但是随着深度学习的不断发展,深度学习模型也变得越来越复杂,用户对框架的灵活性要求越来越高,Caffe的作者贾杨清目前在Facebook开发出了Caffe2,以适应不断发展的需求。

1.2.2 MXNet

MXNet主要继承于DMLC的CXXNet和Minerva这两个项目,其名字来自Minerva的M和CXXNet的XNet。MXNet是深度学习开源世界非常优秀的项目,它借鉴了Torch、Theano等众多平台的设计思想,并且加入了更多新的功能。它采用C++开发,支持的接口语言多达7种,包括Python、R、Julia、Scala、JavaScript、MATLAB和Go。

MXNet的优势如下。

  • 吸收它之前的各个开源框架之精华,设计更加合理。
  • 支持分布式,非常方便支持多机多GPU。
  • 资源利用率高,对深度学习的计算做了专门的优化,GPU显存和计算效率都比较高,其单机和分布式性能都非常好。
  • 支持众多的语言接口,使用既灵活又方便。
  • MXNet的代码量小、灵活高效,专注于核心深度学习领域,容易深度定制。

最近,亚马逊宣布将MXNet作为亚马逊AWS最主要的深度学习框架,并且还会为MXNet的开发提供软件代码和投资。我们相信在亚马逊这种巨头的支持下,MXNet将迎来更大的发展空间。

1.2.3 Torch

Torch已经诞生了10年之久,一直以来主要用于在研究机构里进行机器学习算法相关的科学计算。它并没有跟随Python的潮流,它的操作语言是Lua语言。Torch被Facebook的人工智能实验室和之前英国的DeepMind团队广泛使用。

Torch的封装少,简单直接,前期学习和开发时的思维难度都比较低,具有比较好的灵活性和速度。

由于封装少和Lua本身的限制,工程性不好,所以Torch更加适合于探索性研究开发,而不适合做大项目。但是Torch拥有大量的用户,有很多新的算法或者论文都是用Torch实现的。有点不好的地方,那就是采用的是不太流行的Lua语言来操作,不熟悉的用户需要一点时间来学习。

最近,Facebook开源了基于Torch7的深度学习框架TorchNet,Torch在以后应该会有更好的发展和更多的应用。

Facebook的人工智能研究团队在Torch7之后又开发了PyTorch深度学习框架。作为NumPy的替代品,它支持强大的GPU计算;另一方面,作为深度学习平台,PyTorch的最大特点是完全支持动态定义计算图,提供强大的灵活性和速度,可以快速实现简单的实验性代码,快速验证自己的想法是否可行。

1.2.4 Theano

Theano本来和深度学习没有什么关系,是一群研究者想用Python来做一些科学计算,但是只用NumPy和SciPy效率太低,于是想只调用一下库就可以对各种符号表达式进行自动求导,就造了一些轮子,让这些轮子可以和数值计算无缝对接,这样就有了Theano的原型。

Theano是一个强大的数值计算库,几乎能在任何情况下使用,从简单的逻辑回归到建模,生成音乐和弦序列或是使用长短期记忆人工神经网络对电影收视率进行分类,都可以使用Theano。

Theano的大部分代码是使用Cython编写的。Cython是一个可编译为本地可执行代码的Python语言,与仅仅使用解释性Python语言相比,它能够使运行速度快速提升。

最重要的是,很多优化程序已经集成到Theano库中,它能够优化你的计算量并让你的运行时间保持最低。Theano派生出了大量的深度学习Python软件包,最大的特点是非常灵活,适合做学术研究实验,你可以仅仅使用Python语言来创建几乎任何类型的神经网络结构。不足的是,Theano程序的编译过程比较慢,在导入Theano的时候也比较慢。

1.2.5 CNTK

CNTK的全称是Microsoft Cognitive Toolkit,来源于微软开源的深度学习框架,基于C++开发的跨多个平台的深度学习框架。它支持分布式和多机多卡,使用方式和Caffe类似,通过配置文件来运行,最近也开始支持Python的操作接口。

CNTK通过一个有向图将神经网络描述为一系列运算操作,这个有向图中的子节点代表输入或网络参数,其他节点代表各种矩阵运算。CNTK支持各种前馈网络,包括MLP、CNN、RNN、LSTM、Sequence-to-Sequence模型等,也支持自动求解梯度。CNTK有丰富的细粒度的神经网络组件,这样用户不需要写底层的C++或CUDA,就能通过组合这些组件设计新的复杂的网络层(layer)。CNTK拥有产品级的代码质量,支持多机、多GPU的分布式训练。

CNTK设计是性能导向的,在CPU、单GPU、多GPU,以及GPU集群上都有非常优异的表现。同时,微软最近推出的1-bit compression技术大大降低了通信代价,让大规模并行训练拥有很高的效率。CNTK同时宣称拥有很高的灵活度,它和Caffe一样通过配置文件定义网络结构,再通过命令行程序执行训练,支持构建任意的计算图,支持Adagrad、RMSprop等优化方法。它的另一个重要特性就是拓展性,CNTK除了内置的大量运算核,还允许用户定义他们自己的计算节点,支持高度的定制化。

CNTK原生支持多GPU和分布式,从官网公布的对比评测来看,性能非常不错。在多GPU方面,CNTK比其他深度学习库表现更突出。

目录