
3.6 机器学习深度库TensorFlow
TensorFlow是一个用于人工智能的开源神器,其最初由Google(谷歌)大脑小组(隶属于Google机器智能研究机构)的研究员和工程师们开发出来,用于机器学习和深度神经网络方面的研究,但这个系统的通用性使其也可广泛用于其他计算领域。TensorFlow主页:https://tensorflow.google.cn,如图3-31所示。

图3-31 TensorFlow主页
TensorFlow支持Python和C++语言,以及CNN、RNN和LSTM等算法,可以被用于语音识别或图像处理等多项深度学习领域,是目前最受欢迎的深度学习平台之一。
一般来说,TensorFlow使用图(Graph)来表示计算任务,使用会话(Session)上下文(Context)执行图,使用张量(Tensor)表示数据,使用变量(Variable)记录计算状态,使用Feed和Fetch可以做任意的操作赋值或者从其中获取数据。
TensorFlow的工作原理描述如下。
(1)构建图(graphs)来表示计算任务。
(2)使用张量(Tensor)来表示数据。TensorFlow的张量(Tensor)可以看作一个N维数组或列表。在TensorFlow中这种数据结构表示所有的数据。
(3)使用会话(Session)来执行图。Session是运行TensorFlow操作的类,通过Session执行图,一般使用格式如下。

或者采用如下简化的方式。

(4)使用变量(Variables)来维护状态。变量是计算过程中需要动态调整的数据,维护整个图执行过程中的状态信息。
(5)使用供给(feeds)和取回(fetches)来传入和传出数据。TensorFlow的feed_dict可实现feed数据功能,会话运行完成之后,如果我们想查看会话运行的结果,就需要使用fetch来实现。
3.6.1 TensorFlow的安装
TensorFlow有两种版本:CPU版本和GPU版本。GPU版本需要CUDA和CUDNN的支持,CPU版本不需要。如果要安装GPU版本,要先确认显卡支持CUDA。
安装CPU版本的pip命令是pip install tensorflow,如图3-32所示。

图3-32 TensorFlow的CPU版本安装
安装GPU版本的pip命令是pip install tensorflow-gpu,如图3-33所示。

图3-33 TensorFlow的GPU版本安装
在Python的IDE中输入使用TendorFlow的代码,若能正常运行,说明TensorFlow安装成功,代码如下。

3.6.2 TensorFlow的深度学习方式
TensorFlow是Google 2015年开源的为深度学习算法开发的一套框架,目前在学术界和工业界非常受欢迎,其成为广受欢迎的深度学习库的原因主要包括如下几点。
(1)TensorFlow是一个强大的库,用于执行深度学习大规模的数值计算。
(2)TensorFlow在后端使用C/C++,计算速度更快。
(3)TensorFlow有一个高级机器学习API,可以更容易地设置、训练和评估大量的机器学习模型。
(4)可以在TensorFlow上使用高级深度学习库Keras。
TensorFlow训练的典型步骤:(1)定义学习的函数;(2)定义损失函数;(3)定义优化器;(4)最小化损失函数;(5)初始化所有参数;(6)创建会话;(7)进行训练。
实例代码如下。


代码运行输出结果如下。

上面是最简单的TensorFlow学习方式,在实际使用神经网络进行学习时,常会用到下面一些典型的TensorFlow内置神经函数模块(使用import tensorflow as tf命令,将TensorFlow简写为tf)。
1.卷积函数tf.nn.conv2d
该函数是TensorFlow实现卷积的函数,其结果返回一个Tensor,为输入的特征映射,函数格式如下。

参数说明如下。
(1)input:需要做卷积的输入数据,要求是一个Tensor,例如输入数据是图像,则为一个四维的Tensor:[batch, in_height, in_width, in_channels],其中参数可以理解为[训练时一个batch的图片数量,图片高度,图片宽度,图像通道数]。
(2)filter:相当于CNN中的卷积核,也是一个Tensor,例如对于图像:[filter_height, filter_width, in_channels, out_channels],其中参数可以理解为[卷积核的高度,卷积核的宽度,通道数,卷积核个数],要求类型与参数input相同,注意第三个参数in_channels,是input的第四个参数。
(3)strides:卷积的步长,是一个一维的向量。
(4)padding:string类型的量,值为SAME或VALID,表示不同的卷积方式。
(5)use_cudnn_on_gpu:Bool类型值,是否使用Cudnn加速,默认为True。
(6)name:指定该操作的名字。
2.激活函数tf.nn.relu
格式为tf.nn.relu(features, name=None),用于为矩阵中每个元素使用函数max(features, 0)。
3.池化函数tf.nn.max_pool
格式为tf.nn.max_pool(value, ksize, strides, padding, data_format, name)。
参数说明如下。
(1)value:需要池化的输入,一般池化层接在卷积层后面,例如[batch, height, width, channels]。
(2)ksize:池化窗口的大小,一般是一个四维向量,例如[1, in_height, in_width, 1]。
(3)strides:和卷积类似,窗口在每一个维度上滑动的步长,一般也是[1, stride,stride, 1]。
(4)padding:和卷积类似。
结果返回一个Tensor,仍然是[batch, height, width, channels] 这种形式。
4.平均值函数tf.reduce_mean
用于计算张量沿着指定的数轴(Tensor的某一维度)上的平均值,格式为tf.reduce_mean (input_tensor, axis=None, keep_dims=False, name=None,reduction_indices=None)。
参数说明如下。
(1)input_tensor:输入数据。
(2)axis:指定计算的轴,如果不指定,则计算所有元素的均值。
(3)keep_dims:布尔型,如果为True,则输出的结果保持输入Tensor的形状;若设置为False,则输出结果会降低维度。
(4)name:操作的名字。
(5)reduction_indices:兼容以前版本用来指定轴,已弃用。
5.防止过拟合函数tf.nn.dropout
格式为tf.nn.dropout(input, keep_prob, noise_shape=None, seed=None,name=None)。
参数说明如下。
(1)input:输入数据。
(2)keep_prob:每个元素被保留下来的概率,设置神经元被选中的概率,在初始化时一般keep_prob是一个占位符符,例如keep_prob=tf.placeholder(tf.float32)。
(3)noise_shape:一维的张量,代表了随机产生“保留/丢弃”标志的shape。
(4)seed:随机数种子,整形变量。
(5)name:操作的名字。
6.求交叉熵函数tf.nn.softmax_cross_entropy_with_logits
该函数是TensorFlow中常用的求交叉熵的函数,格式为tf.nn.softmax_cross_entropy_with_logits(logits, labels, name=None)。
参数说明如下。
(1)logits:神经网络最后一层的输出。
(2)labels:实际的标签,大小与logits相同。
7.求值的概率函数tf.nn.softmax
格式为tf.nn.softmax(logits, axis=None, name=None, dim=None )。
将输入数据logits中的元素映射到(0,1)的区间上,将各个值以概率的形式表现出来。
8.训练参数选择tf.train
(1)优化器(Optimizer):选项包括tf.train.Optimizer、tf.train.AdadeltaOpzimizer、tf.train.GradientDescentOptimizer、tf.train.MomentumOptimizer、tf.train.AdagradDAOptimizer、tf.train.FtrlOptimizer、tf.train.AdamOptimizer、tf.train.ProximalAdagradOptimizer、tf.train.Proximal GradientDescentOptimizer、tf.train.RMSPropOptimizer等。例如tf.train.GradientDescentOptimizer()为随机梯度下降算法,使参数沿着梯度的反方向,即总损失减小的方向移动,实现更新参数;tf.train.AdamOptimizer()为自适应学习率的优化算法,是一个寻找全局最优点的优化算法,引入了二次方梯度校正。
(2)梯度计算:选项包括tf.gradients、tf.stop_gradient、tf.AggregationMethod、tf.hessians等。
(3)学习率衰减(Decaying the Learning Rate):选项包括tf.train.exponential_decay、tf.train. natural_exp_decay、tf.train.inverse_time_decay、tf.train.polynomial_decay、tf.train.piecewise_constant等。
3.6.3 TensorLayer
TensorLayer是为研究人员和工程师设计的一款基于Google TensorFlow开发的深度学习与强化学习库。它提供高级别的(Higher-Level)深度学习API,这样不仅可以加快研究人员的实验速度,也能够减少工程师在实际开发中的重复工作。TensorLayer非常易于修改和扩展,这使它可以同时用于机器学习的研究与应用。此外,TensorLayer提供了大量实例和教程来帮助初学者理解深度学习,并提供大量的官方实例程序,方便开发者快速找到适合自己项目的例子。
3.6.4 可视化工具TensorBoard
TensorBoard是一个非常有用的TensorFlow可视化工具,能帮助我们分析训练效果。深度学习过程就像一个黑盒子,其内部的组织、结构以及训练过程很难看明白,这给深度学习的原理理解和工程化应用带来了很大的困难。为了解决这个问题,TensorBoard应运而生。TensorBoard通过将TensorFlow运行输出的日志文件的信息可视化,使得对TensorFlow应用的理解、调试和优化更加高效。
在安装TensorFlow的时候同时也安装了TensorBoard,如果没有安装,可使用pip命令完成安装:pip install tensorboard。TensorBoard的使用方法如下。
(1)将程序运行的计算图写入文件。可以调用tf.summary.FileWritter将计算图写入文件,格式为“tf.summary.FileWritter(path,sess.graph)”。
示例代码如下。

运行上面的代码,查询当前目录的logs分支目录,可以找到一个新生成的文件,就是计算图文件。
(2)在命令控制台输入启动命令“tensorboard --logdir=logs”,“--logdir”指定计算图路径,如图3-34所示。

图3-34 启动TensorBoard
(3)打开浏览器,输入地址“http://localhost:6006/”,出现可视化的计算图,如图3-35所示。

图3-35 可视化的计算图