基于滴滴云虚拟机的TensorFlow搭建与使用

前言

随着AI算法不断发展,对应的应用领域也越来越广泛,比如自动驾驶、语音机器人等技术已经越来越贴近人们的生活。但是AI庞大的算法体系让工程师们望而却步,不知道该如何使用这些算法来解决工程中的实际问题,所以市面上诞生了很多优秀的开源框架,本文介绍的TensorFlow就是其中一款最广为人知的工具集合,文章将从TensorFlow的安装和其在神经网络中的简单使用这两个大方面展开。

TensorFlow的基本概念

TensorFlow是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)表示在节点间相互联系的多维数据数组,即张量(tensor)。它灵活的架构使得可以在多种平台上展开计算,例如台式计算机中的一个或多个CPU(或GPU)、服务器、移动设备等。

TensorFlow 最初由Google大脑小组(隶属于Google机器智能研究机构)的研究员和工程师们开发出来,用于机器学习和深度神经网络方面的研究,但这个系统的通用性使其也可广泛用于其他计算领域。

TensorFlow的安装

1.操作系统的选择与安装

TensorFlow支持几乎所有的主流操作系统,Ubuntu,CentOS,MacOS等是最常用的选择,但Android和iOS也在其支持之列。本文将选择最常用的Linux开发版——Ubuntu作为安装环境。

首先,在滴滴云上申请一个云服务器,操作系统选择Ubuntu16.04,配置CPU 2核、内存 4G(可以按照自己的实际需求配置),也可以选择GPU,因为TensorFlow本身支持各种架构的计算,可以在代码中动态选择运行在CPU上还是在GPU上面。一旦选择完配置,点击创建就会快速生成云服务器。

2.Python环境及TensorFlow的安装

TensorFlow 目前已经支持使用多种接口进行调用,但是Python目前在人工智能领域使用得越来越广泛,不仅TensorFlow,很多机器学习的算法首选使用Python进行描述,目前可以选择Python2.x或者3.x,而本次使用的滴滴云服务器安装的Ubuntu默认已经安装了2.x的环境,可以用以下语句来检测:

dc2-user@10-254-187-7:~$ python --version
Python 2.7.12

以上表明安装了2.7.12的版本,是符合TensorFlow要求的一个版本。

但是只安装Python还不能达到最小环境需求,因为Python的许多功能是以库的形式存在的,例如TensorFlow本身就是一个库,另外还需要NumPy。如果一个个通过源码安装比较麻烦,一般使用Python的库管理器:pip来进行安装和管理所有的Python库。

滴滴云的Ubuntu中已经预置了pip,所以无需安装就直接可以使用。

dc2-user@10-254-187-7:~$ sudo pip install numpy
...
...
Installing collected packages: numpy
Successfully installed numpy

当出现上述Successfully installed时就表明numpy已经安装成功,下面用同样的方法可以安装TensorFlow的Python库:

dc2-user@10-254-187-7:~$ sudo pip install -i http://pypi.mirrors.ustc.edu.cn/simple/ --trusted-host pypi.mirrors.ustc.edu.cn tensorflow
...
...
Successfully installed absl-py-0.5.0 astor-0.7.1 backports.weakref-1.0.post1 enum34-1.1.6 funcsigs-1.0.2 futures-3.2.0 gast-0.2.0 grpcio-1.15.0 h5py-2.8.0 keras-applications-1.0.6 keras-preprocessing-1.0.5 markdown-3.0.1 mock-2.0.0 pbr-4.3.0 protobuf-3.6.1 tensorboard-1.11.0 tensorflow-1.11.0 termcolor-1.1.0 werkzeug-0.14.1

如果出现红色的错误可以运行以下命令来解决:

dc2-user@10-254-187-7:~$ sudo pip install --upgrade pip

当出现上面的成功回显时就表明TensorFlow的安装包已经安装完毕,可以使用了。

接下去输入以下命令进入Python环境进行验证:

dc2-user@10-254-187-7:~$ python
Python 2.7.12 (default, Dec  4 2017, 14:50:18)
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
2018-10-29 18:51:46.520277: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled touse: AVX2 FMA
>>> print(sess.run(hello))
Hello, TensorFlow!

出现上面的代码运行结果就表明已经在滴滴云服务器上运行了TensorFlow版本的"hello,world"程序。

3. TensorFlow在神经网络中的简单应用

神经网络作为机器学习的前延技术,这些年来广泛地出现在各种机器学习的应用中,而TensorFlow中较好地封装了一些最常用的算法,所以使用TensorFlow可以高效地组织算法,快速地训练出想要的模型。

在使用神经网络解决实际的分类或者回归问题时需要更好地设置参数取值。使用监督学习的方式设置神经网络参数需要有一个标注好的训练数据集。以判断零件是否合格为例,这个标注好的训练数据集就是收集的一批合格零件和一批不合格零件。

监督学习最重要的思想就是,在已知答案的标注数据集上,模型给出的预测结果要尽量接近真实的答案。通过调整神经网络中的参数对训练数据进行拟合,可以使得模型对未知的样本提供预测的能力。

在神经网络优化算法中, 最常用的方法是反向传播算法(backpropagation)。下图展示了使用反向传播算法训练神经网络的流程图,本文将不过多讲解反向传播的数学公式,而是重点介绍如何通过TensorFlow 实现反向传播的过程。

Created with Raphaël 2.2.0 Start 初始化变量训练次数=0 选取一部分训练数据 通过前向传播获取预测值 通过前向传播获更新变量 达到训练目标? 训练结束 达到训练次数? 训练次数+1 yes no yes no

从上图可以看出,通过反向传播算法优化神经网络是一个迭代的过程。在每次迭代的开始,首先需要选取一小部分训练数据,这一小部分数据叫做一个batch。然后,这个batch 的样例会通过前向传播算法得到神经网络模型的预测结果。因为训练数据都是有正确答案标注的,所以可以计算出当前神经网络模型的预测答案与正确答案之间的差距。

最后,基于这预测值和真实值之间的差距,反向传播算法会相应更新神经网络参数的取值,使得在这个batch 上神经网络模型的预测结果和真实答案更加接近。通过TensorFlow 实现反向传播算法的第一步是使用TensorFlow 表达一个batch 的数据。在上面的样例中使用了常量来表达过一个样例:

x=tf.constant([[0.7, 0.9]])

但如果每轮迭代中选取的数据都要通过常量来表示,那么TensorFlow的计算图将会太大。因为每生成一个常量,TensorFlow 都会在计算图增加一个节点。一般来说,一个神经网络的训练过程会需要经过几百万轮甚至几亿轮的迭代,这样计算图就会非常大,而且利用率很低。为了避免这个问题,TensorFlow 提供了placeholder 机制用于提供输入数据。placeholder 相当于定义了一个位置,这个位置中的数据在程序运行时再指定。

这样,在程序中就不需要生成大量常量来提供输入数据,而只需要将数据通过placeholder 传入TensorFlow 计算图。在placeholder 定义时,这个位置上的数据类型是需要指定的。和其他张量一样,placeholder 的类型也是不可以改变的。

placeholder 中数据的维度信息可以根据提供的数据推导得出,所以不一定要给出。下面给出了通过placeholder 实现前向传播算法的代码:

x = tf.placeholder(tf.float32, shape=(1, 2), name="input")
print(sess.run(y, feed_dict={x: [[0.7,0.9]]}))

在调用sess.run 时,需要使用feed_dict 来设定x 的取值。在得到一个batch 的前向传播结果之后,需要定义一个损失函数来刻画当前的预测值和真实答案之间的差距。然后通过反向传播算法来调整神经网络参数的取值使得差距可以被缩小。

损失函数将在后面的文章中更加详细地介绍。以下代码定义了一个简单的损失函数,并通过TensorFlow 定义了反向传播的算法:

#定义损失函数来刻画预测值与真实值的差距
cross_entropy = -tf.reduce_mean(
y_ * tf.log(tf.clip_by_value(y, 1e-10, 1.0)))
# 定义学习率。
learning_rate = 0.001
# 定义反向传播算法来优化神经网络中的参数。
train_step =
tf.train.AdamOptimizer(learning_rate).minimize(cross_entropy)

在上面的代码中,cross_entropy 定义了真实值和预测值之间的交叉熵(cross entropy),这是分类问题中一个常用的损失函数。第二行train_step 定义了反向传播的优化方法。

目前TensorFlow 支持10 种不同的优化器,读者可以根据具体的应用选择不同的优化算法。比较常用的优化方法有三种:tf.train.GradientDescentOptimizer、class tf.train.AdamOptimizer和tf.train.MomentumOptimizer。

4.总结
人工智能的飞速发展给科技界带来了新的气象,TensorFlow等机器学习框架给我们带来了新的学习和应用AI的途径,本文讲述了如何在一个全新的滴滴云服务器上一步步搭建Python和TensorFlow,并使用TensorFlow实现了一个简单的神经网络反向传播算法。

猜你喜欢

转载自blog.csdn.net/java060515/article/details/83624429