深度学习三人行 (第 1 期)---- TensorFlow 爱之初体验



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

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

从该期开始,我们将一起学习深度学习相关知识。学习的路上,我们多多交流,共同进步。本期主要内容如下:

  • TensorFlow 介绍与安装

  • TensorFlow 之牛刀小试

  • 线性回归 TF 实战


一. TensorFlow 介绍与安装

深度学习火的一塌糊涂,我们都知道 TensorFlow 是 Google 开源的一款人工智能学习库。我们来一起解读下 tenrflow 到底啥意思:Tensor 的意思是张量,代表 N 维数组;Flow 的意思是流,代表基于数据流图的计算。把 N 维数字从流图的一端流动到另一端的过程,就是人工智能神经网络进行分析和处理的过程。

1.1 TensorFlow 介绍

TensorFlow 的基本规则很简单,总体来说分两步:

首先,定义一个满足计算任务的图,图中有很多节点,接下来 TensorFlow 用优化后的 C++ 代码进行高效的计算。我们来看一个简单的例子:

上图表示定义的一个简单方程计算任务,通过调用 TensorFlow 库便可以对该任务进行计算。我们知道,任何一门编程语言都可以进行计算如此简单的方程任务,那么我们为什么要用 TensorFlow 呢?

对于这个简单的方程计算,我们当然可以不用 TensorFlow 计算,这里我们作为一个例子来一起学习下为什么要用 TensorFlow 来计算。一个重要的因素就是,TensorFlow 支持将一个图计算任务,拆分成多个块(如下图):

然后通过多个 CPU 或 GPU 进行并行交叉运算,另外 TensorFlow 还支持分布式计算。因此我们在巨大的数据量的情况下训练庞大的神经网络的时候,就不会有那么大的压力。

在当前的深度学习库中,有很多开源的学习库,如下表:

我们为什么选择 TensorFlow 库呢?

我们详细看下 TensorFlow 有什么优势:

  • 多平台运行,Windows,Linux,macOS,IOS 和 Android 等

  • 提供简单的 Python API (TELearn²) 兼容 SciKit-Learn 机器学习库

  • 提供简单 API (TF-slim) 去建立训练和评价神经网络模型

  • 包含很多机器学习方法的高性能的 C++ 优化代码

  • 强大的可视化 (TensorBoard) 可以查看计算过程,比如学习曲线

  • TensorFlow 还可以在谷歌云上进行计算图

当然,TensorFlow 的优势不只上面所列,还有很多,我们一起学习和发掘。

1.2 TensorFlow 安装

安装 TensorFlow 在 Python 中和安装其他库类似,可以用 pip 进行安装,也可以直接在 Pycharm 或 Anaconda 中进行安装。当然,机器支持 GPU 的话,建议安装 GPU 版本。so easy, 这里不再详述。


二. TensorFlow 之牛刀小试

上节讲到,对于 TensorFlow 的操作分为两个步骤,首先是创建图,然后计算。在这里我们一起学习创建图和运行的几种方法,管理图和节点的生命周期。

2.1 创建图

以上节描述的图为例,如何创建呢?如下代码,即创建了该方程计算图:

这里需要注意的一点就是,虽然代码看起来好像做了一些计算,特别是最后一行,上面的代码中仅仅是在默认图中添加了一些节点而已,并没有去计算函数的值,甚至连变量初始化都没有做。那么如何计算上面的图呢?

2.2 运行图的常见方法

  • 为了计算上图方程,TensorFlow 中需要开启一个 session,并用这个 session 去初始化变量并且做最终计算。如下代码:

上面的方法有一个缺点,就是需要重复代码 sess.run() 来对变量进行初始化,并且需要手动关闭 session,这样显得有些繁琐。

  • 这里我们介绍一种略微方便的一种方法,如下:

在这个 with 语句中,这个 sess 被设置为默认的 session,也就是说语句 x.initializer.run()相当于 tf.get_default_session().run(x.initializer),并且 f.eval()相当于调用 tf.get_default_session().run(f),这种运行图的方法比较易读,并且自动关闭 session,不需要我们手动关闭。关于图的管理,下面会介绍。

  • 上面介绍的两种运行图的方法都需要手动初始化每一个变量,但是对于大型的神经网络计算图来说,这无疑是自找麻烦,这里介绍一种自动初始化变量的方法:

在这个方法中,我们通过调用函数 tf.global_variables_initializer(),代替了手动逐一初始化。但是这里需要注意的是,这个函数实际上并没有立即对变量进行初始化,而是在运行的时候才进行初始化。

  • 其实在 python 或者在 jupyter 中,一般更喜欢这样运行图:

这种创建 session 的方法设置自己是默认的 session,并且需要手动关闭 session。但是这样减少了 with 语句的应用,使得看起来更为简洁。

从上面的方法可以看出,一个 TensorFlow 的程序明显的分为两部分,第一部分是创建一个计算图也称为创建阶段,第二部分是计算该图,也称为执行阶段。创建阶段一般是创建一个机器学习需要训练的模型,而执行阶段一般是执行训练过程。下节我们将会看到一实例。

2.3 图的管理

对于我们创建的任何一个节点,都会放到默认的图中(系统会默认创建一个),在大多数情况下,这样没问题且能满足我们的应用需求的,如下:

但是,有时候我们可能需要同时管理多个独立的图,这时可以通过新建一个图并临时把该图作为一个默认图(因为我们添加的节点默认情况下是在默认图中),如下,在 with 语句中,x2 所在的图还是默认图,但是 with 语句之外 x2 所在的图已经不是默认图了。也就是说 graph 只有在 with 语句中才是默认图,一旦出了 with 语句,默认图自动变为系统创建的默认图。

很多时候,我们在测试的时候,会重复运行一段代码,那么我们会结束一个包含很多节点的图,如果不 reset 默认图的话,那么默认图会有很多冗余的节点,暂用资源,一般 reset 默认图有两种方法,比如在 jupyter 中,其中一个方法就是重启 jupyter kernel,但是常用的另一种方法是通过运行代码 tf.reset_default_graph() 来结束默认图。

2.4 节点的生命周期

当我们需要计算一个节点的时候,TensorFlow 会自动判断该节点所依靠的其他节点,并先计算所以靠的其他节点值。如下:

当我们需要计算 y 的值的时候,TensorFlow 会自动检测到 y 的值依靠 x,而 x 依靠 w,并且会先计算 w 的值,再计算 x 的值,最后计算 y 的值。而当计算 z 值的时候会重复上面的步骤,并不会去调用计算 y 的时候计算出来的 x 的值。也就是说会计算两次 w 和 x 的值。

其实在不同的图之间运行,TensorFlow 会释放掉所有的节点值(除了某些特殊值和变量值会被保留)。一个变量值的声明周期从它的 initializer 开始,到 session 结束。

我们知道上面的计算 y 和 z 的值需要两次计算 w 和 x 节点,但是,如果想更高效率的计算 y 和 z 的值的话,则需要将两个计算放到一个图中,如下:

其实在单线程中,多个 session 之间不共享任何信息,即使不同 session 计算同一个图(每一个 session 都有自己的变量 copy)。在分布式的 TensorFlow 中变量信息存放在服务器中,而不是在 session 中,所以多 session 可以共享变量。


三. 线性回归 TF 实战

这里,我们将 TensorFlow 和用 NumPy 以及 Scikit-Learn 做一个比较,进而更加详细的了解 TensorFlow。

3.1 TensorFlow 线性回归

TensorFlow 支持多输入多输出的操作,比方说相加和相差运算是两个输入一个输出,常数和变量是没有输入。这里的输入和输出都是多维数组,也称 tensor。就像 numpy 中的数组,tensor 有一个类型和尺寸。

之前的例子中,我们 tensor 只包含了单一数值,接下来,我们将用 TensorFlow 来实战一下线性回归这里我们用机器学习三人行系列(公众号回复“机器学习”进行查看)中的房价数据做回归,先上代码在讲解如下:

从上面代码中,我们可以看到,首先获取了房价的数据集,然后在每条数据的前面加 1(大家考虑下为什么加 1,欢迎文末留言讨论),接着创建了两个常量节点来承载数据和 label,之后就是计算线性回归的系数。其实θ的计算是根据下面的公式计算出来的:

上面代码和直接用 numpy 直接计算θ的主要区别是在于如果我们的电脑上支持 GPU 计算的话,那么其将自动调用 GPU 资源运行。

3.2 NumPy 线性回归

NumPy 的方法,我们直接求取上面的公式如下:

从这结果里面,我们可以看到用 TensorFlow 和 NumPy 的方法得到的值是很相近的。

3.3 Scikit-Learn 线性回归

关于 Scikit-Learn 线性回归的线性回归,这里不多说,详情查看机器学习系列文章。如下:

可以看到,三种方法得到的结果十分相近。


四. 本期小结

本期我们从 TensorFlow 的简介特性入手,熟悉了 TensorFlow 的相关流程,以及如何创建图,运行图的几种常见的方法,最后,我们通过 TensorFlow 的线性回归与 NumPy 的线性回归和 Scikit-Learn 之间的线性回归进行比较,来学习了 TensorFlow 在线性回归方面的应用。


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

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