AIQ | 基于 TensorFlow 的深度学习实战



转载请注明 AIQ - 最专业的机器学习大数据社区  http://www.6aiq.com

AIQ 机器学习大数据 知乎专栏 点击关注

TensorFlow 是 Google 的开源深度学习库,在图形分类、音频处理、推荐系统和自然语言处理等场景下都有丰富的应用。毫不夸张得说,TensorFlow 的流行让深度学习门槛变得越来越低,只要你有 Python 和机器学习基础,入门和使用神经网络模型变得非常简单。

TensorFlow 简介

如前所述,TensorFlow 是一个深度学习库,使用这一框架,可以用来构建和测试深度神经网络。

深度学习让我们能够以极高的准确性构建复杂的应用程序。图像、视频、文本、音频等领域的问题,都可以通过深度学习解决。TensorFlow 可以用于实现前述所有应用。

TensorFlow 很快成为 GitHub 上用户最多的深度学习框架。这个库之所以如此流行,是因为开发人员可以轻松的用其来搭建、测试和部署机器学习应用。

上面是一个 TensorFlow 的示意图。我们不用关心这张图具体代表什么,但你需要知道,其中的椭圆和正方形代表节点,节点就是一些数学函数,你可以将节点分组形成各种数学计算,并得到输出。

箭头代表流动到各个节点的数据。所以 TensorFlow 也被成为数据流库。

TensorFlow 从入门到应用

安装 TensorFlow

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

首先安装必备软件:

# 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 目录下, 执行:

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

接下来激活 virtualenv:

$ 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:

# 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 需要安装额外的软件。

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

(tensorflow)$ deactivate

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

TensorFlow 的 “Hello World”

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

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

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 的算术操作如下:

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 也为程序员提供一些函数来进行数学操作,列表如下:
ef9dda6da64b4656a9719678bf1fb461.png

接下来,创建一个会话。事实上,直到这步还没有执行 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。下面是一些重要的操作:
ad72c54dfce2447a8f5eacfac962be66.png

逻辑回归问题与模型

前面的 Hello world 应用并没有训练模型,接下来介绍一个逻辑回归问题与模型。我们使用 numpy 构建一组线性关系的数据,通过 TensorFlow 实现的随机梯度算法,在训练足够长的时间后可以自动求解函数中的斜率和截距。

上面的代码可以在 tensorflow_examples 项目(https://github.com/tobegit3hub/tensorflow_examples/blob/master/linear_regression.py)中找到,经过训练,我们看到输出的斜率 w 约为 2,截距 b 约为 10,与我们构建的数据之间的关联关系十分吻合!注意在 TensorFlow 代码中并没有实现最小二乘法等算法,也没有 if-else 来控制代码逻辑,完全是由数据驱动并且根据梯度下降算法动态调整 Loss 值学习出来的。这样我们即使换了其他数据集,甚至换成图像分类等其他领域的问题,无需修改代码也可以由机器自动学习,这也是神经网络和 TensorFlow 强大的地方。

前面的模型只有 w 和 b 两个变量,如果数据处于非线性关系就难以得到很好的结果,因此我们建议使用深层神经网络,这也是 TensorFlow 设计重点就要解决的深度学习模型。Google 在 2014 年凭借 Inception 模型赢下了 ImageNet 全球竞赛,里面代码就是基于 TensorFlow 实现的,下面是较为复杂的模型定义代码。

使用 TensorFlow 已经封装好的全连接网络、卷积神经网络、RNN 和 LSTM,我们已经可以组合出各种网络模型,实现 Inception 这样的多层神经网络如拼凑 Lego 一样简单。但在选择优化算法、生成 TFRecords、导出模型文件和支持分布式训练上,有较多的细节,大家在实际练习中要多加注意。


更多高质资源 尽在AIQ 机器学习大数据 知乎专栏 点击关注

转载请注明 AIQ - 最专业的机器学习大数据社区  http://www.6aiq.com