第9章 启动并运行TensorFlow

  TensorFlow是一个面向数值计算领域的强大的开源软件库,尤其适用于大规模机器学习。它的基本原则很简单:使用者先用Python定义一个待执行的计算图(例如图9-1所示),然后,TensorFlow拿到该图并使用优化过的C++代码高效地运行该图。

图9-1. 一个简单的计算图

  非常重要的是,TensorFlow允许你将图分割为若干子图,并在多个CPU或者GPU上并行地运行这些子图(如图9-2)。TensorFlow也支持分布式计算,因此你可以在超大型的数据集上通过将计算分摊在成百上千的服务上(在一个可接受的时间内)训练出一个超大型的神经网络(参考第12章)。TensorFlow可以在大型数据集上(例如数十亿个样本实例,每个样本实例包含数百万个特征)训练带有数百万参数的神经网络。你应该不会感到吃惊,因为TensorFlow是由谷歌大脑团队所开发且驱动着谷歌的许多大规模服务,例如谷歌云语音、谷歌照片以及谷歌搜索。

图9-2. 在多个CPU/GPU/服务上并行计算

  当TensorFlow在2015年11月开源时,市面上已经存在许多受欢迎的深度学习开源库(表9-1列举了一部分),因此TensorFlow的大多数功能已经在某些软件库中存在了。不过,由于清爽的设计、高度可伸缩性、灵活性以及非常完美的文档,TensorFlow很快成为了这些开源软件库中的佼佼者。简而言之,TensorFlow被设计得具有灵活性、伸缩性,且容易部署到产品环境中,而已存在的其它框架只包含其中一部分功能。下面是TensorFlow的一些亮点:

  • 它不仅可以运行在Windows、Linux和macOS上,还可以运行在移动设备上,包括iOS和Android。
  • 它提供了与Scikit-Learn兼容的、简单的Python API TF.Learn(tensorflow.contrib.learn)。你在后面会看到,你只需要几行代码就能训练各种类型的神经网络。TF.Learn之前是一个叫做Scikit Flow(或者skflow*)的独立项目。
  • 它还提供了另一个简单的API —— *TF-slim (tensorflow.contrib.slim)来简化构建、训练和评估神经网络的过程。
  • 其它的一些独立的高级API也构建在TensorFlow之上,例如Keras(现在位于 tensorflow.contrib.keras)和Pretty Tensor
  • 它的主要的Python API提供了非常大的灵活性(以更大的复杂性为代价),你可以用它来创建各种你所能想到的神经网络架构。
  • 它的大多数机器学习操作(尤其是那些需要构建神经网络的操作)都提供了高效的C++实现。它也提供了C++ API以允许你定义你自己的高效的操作。
  • 它提供了若干高级的、易于使用的优化节点来优化参数、最小化成本函数。TensorFlow可以自动地计算你所定义的函数的导数。这叫做自动微分(autodiff)。
  • 它包含了一个非常好用的可视化工具TensorBoard,允许你查看计算图、学习曲线等。
  • 谷歌发起了一个可以运行TensorFlow图的云服务
  • 最后,也是非常重要的一点,它有一个非常专注的充满激情的开发团队和开发者,以及一个逐渐成长的参与贡献的社区。TensorFlow是GitHub上最受欢迎的开源项目之一,有越来越多的优秀项目都构建于TensorFlow之上,例如https://www.tensorflow.org/或者https://github.com/jtoy/awesome-tensorflow的资源页面上所列举的项目。对于技术问题,你可以使用http://stackoverflow.com/提问并在提问的时候加上“tensorflow”标签。你可以通过GitHub提出bug或者功能请求。对于常规讨论,请加入谷歌开发小组

在本章,我们将会覆盖TensorFlow的基本概念,从安装到简单图的创建、运行、保存以及可视化。在构建神经网络前掌握这些基本概念非常重要。

表9-1. 深度学习开源软件库(不完整列表)

API 平台 发起者 年份
Caffe Python, C++, Matlab Linux, macOS, Windows Y. Jia, UC Berkeley (BVLC) 2013
Deeplearning4j Java, Scala, Clojure Linux, macOS, Windows, Android A. Gibson, J.Patterson 2014
H2O Python, R Linux, macOS, Windows H2O.ai 2014
MXNet Python, C++, others Linux, macOS, Windows, iOS, Android DMLC 2015
TensorFlow Python, C++ Linux, macOS, Windows, iOS, Android Google 2015
Theano Python Linux, macOS, iOS University of Montreal 2010
Torch C++, Lua Linux, macOS, iOS, Android R. Collobert, K. Kavukcuoglu, C. Farabet 2002

安装

我们开始吧!假设你已经按照第2章中的安装指令按照了Jupyter和Scikit-Learn。你可以直接使用pip按照TensorFlow。如果你使用virtualenv创建了隔离环境,则需要先将它激活:

1
2
$ cd $ML_PATH               # Your ML working directory (e.g., $HOME/ml)
$ source env/bin/activate

接下来,安装TensorFlow(如果你没有使用virtualenv则需要管理员权限或者添加—user选项):

1
$ pip3 install --upgrade tensorflow

注意

如果要支持GPU,则需要安装tensorflow-gpu而不是tensorflow,具体细节请参考第12章。

安装完后,请输入下面的命令检查安装是否成功。如果成功,则会输出你所按照的TensorFlow的版本信息:

1
2
$ python3 -c 'import tensorflow; print(tensorflow.__version__)'
1.3.0

创建第一个图并在会话中运行

下面的代码可用于创建图9-1所示的图:

1
2
3
4
5
import tensorflow as tf

x = tf.Variable(3, name="x")
y = tf.Variable(4, name="y")
f = x*x*y + y + 2

这就是实现该图的所有代码,非常简单!你需要理解的非常重要的一点是,尽管这段代码看上去会执行计算,但实际上它并不会执行任何计算。事实上,变量的值甚至都还没有被初始化。如果要计算该图的值,你需要打开一个TensorFlow会话(Session)并使用这个会话来初始化变量,然后才能求出f的值。

管理图

节点值的生命周期

TensorFlow线性回归

实现梯度下降

手工计算梯度

使用autodiff

使用优化器

向训练算法中喂数据

保存和恢复模型

使用TensorBoard对图和训练曲线可视化

命名空间

模块化

共享变量

练习题