深度学习快速实践:TensorFlow

写在之前:本书是翻译自<first contact with tensorflow>,已获原作者授权。

作者写这本书的目的是为了快速实践深度学习。因此,读者应该有基本的机器学习知识和必要的数据知识。本书将采用主流的机器学习算法来进行tensorflow训练。

第一章将简短介绍TensorFlow代码和编程模型。

Tensorflow基本概念

本章将简短介绍TensorFlow代码和编程模型。学完本章后,期待读者会TensorFlow的package安装方法。

Tensorflow开源包

TensorFlow源于Google大脑团队的机器学习和深度神经网络研究。这个系统能够解决更广泛的机器学习问题。

TensorFlow使用计算图来表示一个计算任务。图中的节点代表数学运算,也可以表示数据的输入、输出和读写等操作;图中的边表示多维数组(Tensors),节点之间的某种联系。

TensorFlow使用计算图来构建计算过程,用符号来表示计算操作。这使得TensorFlow可以同时运用Linux 64位操作系统的CPU 和GPU 性能,TensorFlow也可以在移动端Android 或者iOS 上执行。

TensorFlow的可视化模块TensorBoard可监控算法的运行状态并显示。

TensorFlow Serving

Google最近开源了TensorFlow Serving,TensorFlow Serving可以帮助机器学习开发者将他们的TensorFlow机器学习模型(可以扩展到其它各类型的机器学习模型)加载到产品中。TensorFlow Serving采用C++编写,并已开源到github。

TensorFlow和TensorFlow Serving到底有啥区别呢?

TensorFlow项目主要是基于各种机器学习算法构建模型,并为某些特定类型的数据输入做适应学习,而TensorFlow Serving则专注于让这些模型能够加入到产品环境中。开发者使用TensorFlow构建模型,然后TensorFlow Serving基于客户端输入的数据使用前面TensorFlow训练好的模型进行预测。

个人认为TensorFlow Serving是将tensorflow训练出来的模型更好的应用于生产环境中,通过它的API等支持的方式来方便对外提供稳定可靠的服务。TensorFlow Serving的意义就在于能够很方便的将深度学习生产化,解决了模型无法提供服务的弊端,并且用的是C++语言,性能上应该不错。这样以后深度学习方向的创业公司都能很方便的将产品商业化,保证7*24小时的可靠服务。

典型的pipeline:输入待训练的数据到学习者(Learner)中,输出训练模型。稍后模型验证之后发布到TensorFlow Serving系统。
image
对于生产环境来说,启动模型,随着时间不断迭代模型,新的训练数据出现需要训练优化模型,这些都是常态。现在有了TensorFlow Serving就可以在不停止服务的情况下更新模型和数据,Google内部许多pipelines一直在运行。

客户端和服务端之间的通信采用的是RPC协议实现,其为Google开源的一个高性能RPC框架。

安装TensorFlow

是时候开始练手了,你需要一遍看书一边在电脑上操作。

TensorFlow提供Python API(也可以用C / C ++),所以你得安装Python 2.7(具体咋安装自行Google)。

一般来讲,使用Python工作时最好用virtualenv虚拟环境。Virtualenv可以在一台机器不同的项目间保持Python依赖隔离。使用virtualenv安装TensorFlow不会覆盖已有的Python版本,这样做也能使排查安装问题变得更容易。

首先安装必备软件:

1
2
3
4
5
6
# Ubuntu/Linux 64-bit
$ sudo apt-get install python-pip python-dev python-virtualenv
# Mac OS X
$ sudo easy_install pip
$ sudo pip install --upgrade virtualenv

建立virtualenv环境. 为了将环境建在 ~/tensorflow 目录下, 执行:

1
$ virtualenv --system-site-packages ~/tensorflow

接下来激活virtualenv:

1
2
3
$ source ~/tensorflow/bin/activate # with bash
$ source ~/tensorflow/bin/activate.csh # with csh
(tensorflow)$

Once the virtualenv is activated, you can use pip to install TensorFlow inside it:
激活virtualenv后即可使用pip在virtualenv内安装TensorFlow:

1
2
3
4
5
6
# Ubuntu/Linux 64-bit, CPU only:
(tensorflow)$ sudo pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.7.1-cp27-none-linux_x86_64.whl
# Mac OS X, CPU only:
(tensorflow)$ sudo easy_install --upgrade six
(tensorflow)$ sudo pip install --upgrade https://storage.googleapis.com/tensorflow/mac/tensorflow-0.7.1-cp27-none-any.whl

你可访问官方文档来确认所安装的版本。

如果你要在GPU上跑你的代码,你需要访问官方文档来看看是否满足指定的要求。运行Tensorflow GPU需要安装额外的软件。

当你使用完后可执行如下命令关闭虚拟环境:

1
(tensorflow)$ deactivate

其它安装TensorFlow的方法请访问官方网站获取信息。

TensorFlow的 “Hello World”

你可以使用任何文本编辑器编写python代码,然后保存为扩展名“.py”的文件(eg test.py)。用python命令行即可执行test.py。

为了快速的熟悉TensorFlow编程,下面从一段简单的代码开始:

1
2
3
4
5
6
7
8
9
10
import tensorflow as tf
a = tf.placeholder("float")
b = tf.placeholder("float")
y = tf.mul(a, b)
sess = tf.Session()
print sess.run(y, feed_dict={a: 3, b: 3})

在上面的代码中,导入Python模块tensorflow。然后定义符号变量,也称为占位符。在后面程序执行中会操作这些变量。我们把这些变量作为参数,TensorFlow的乘法函数tf.mul会调用。数学函数tf.mul会操作tensor,这时的动态大小、多维数组。

TensorFlow的算术操作如下:

1
tf.add,tf.sub,tf.mul,tf.div,tf.mod,tf.abs,tf.neg,tf.sign,tf.inv,tf.square,tf.round,tf.sqrt,tf.pow,tf.exp,tf.log,tf.maximum,tf.minimum,tf.cos,tf.sin

TensorFlow也为程序员提供一些函数来进行数学操作,列表如下:
操作 |描述|
—|—|
tf.diag| 给定对角线上的值,返回对角tensor|
tf.transpose| 转置|
tf.matmul| tensor乘法,即矩阵乘法|
tf.matrix_determinant |方阵的行列式|
tf.matrix_inverse| 方阵的逆矩阵|

接下来,创建一个会话。事实上,直到这步还没有执行TensorFlow代码。程序通过Session()创建一个会话与Tensorflow库交互;直到调用run()方法才会创建会话,并运行指定的代码。在本例中,run()方法调用变量值和feed_dict参数,表达式运行完成退出会显示结果9

本例比较简单,仅仅为了展示TensorFlow完整的过程。然而,我们更感兴趣的是灵活的结构化代码,插入操作来构建计算图。比如,类似于Python编程中的IPython。为了达到这个目的,TensorFlow提供了tf.InteractiveSession()类。

编程模型的理解已经超出了本书的范围,但为了继续接下来的章节,我们仅仅需要知道计算结构包含所有的操作信息和数据。

上面的计算图描述的是数学计算。节点(node)代表数学操作,但是它们也可以代表数据项的点,输出结果或者读写持久化的变量。边(edge)描述的是输入和输出的节点之间的关系。

TensorFlow 将图形定义转换成分布式执行的操作, 以充分利用可用的计算资源(如 CPU 或 GPU). 一般你不需要显式指定使用 CPU 还是 GPU, TensorFlow 能自动检测. 如果检测到 GPU, TensorFlow 会尽可能地利用找到的第一个 GPU 来执行操作.

并行计算能让代价大的算法计算加速执行,TensorFlow也在实现上对复杂操作进行了有效的改进。大部分核相关的操作都是设备相关的实现,比如GPU。下面是一些重要的操作/

操作分组 操作
Maths Add, Sub, Mul, Div, Exp, Log, Greater, Less, Equal
Array Concat, Slice, Split, Constant, Rank, Shape, Shuffle
Matrix MatMul, MatrixInverse, MatrixDeterminant
Neuronal Network SoftMax, Sigmoid, ReLU, Convolution2D, MaxPool
Checkpointing Save, Restore
Queues and syncronizations Enqueue, Dequeue, MutexAcquire, MutexRelease
Flow control Merge, Switch, Enter, Leave, NextIteration

TensorBoard:可视化学习

为了更方便TensorFlow 程序的理解,TensorFlow 包括从函数、调试与优化等方面进行了可视化,并发布了一套叫做TensorBoard 的可视化工具。TensorBoard 从不同统计数据来展现图计算过程的详细信息和参数。

TensorBoard模块的数据展示是在TensorFlow执行和汇总数据存储的过程。在TensorFlow的文档,你可以找到更详细的Python API的解释。

输入下面的指令来启动TensorBoard,包括跟踪(也可以成为序列化)的路径参数:

1
(tensorflow)$ tensorboard --logdir=&lt;trace file&gt;

TensorBoard 开始运行,你可以通过在浏览器中输入http://localhost:6006 来查看。TensorBoard可视化工具的详细使用已超出本书的范围,若想了解更多,可参见文档


侠天,专注于大数据、机器学习和数学相关的内容,并有个人公众号:bigdata_ny分享相关技术文章。

若发现以上文章有任何不妥,请联系我。

image