生成对抗网络入门指南(第2版)
上QQ阅读APP看书,第一时间看更新

2.2 TensorFlow基础入门

2.2.1 TensorFlow简介与安装

TensorFlow(见图2-8)是目前行业中最著名的机器学习框架之一,由谷歌大脑团队研发并在2015年开源,开发团队的机器学习研发能力很强,项目一直处于稳定的更新中。TensorFlow的开发者社区同样也非常活跃,目前网络上大量的机器学习开源项目均是用TensorFlow开发完成的,大量的企业也开始把TensorFlow作为标准化的机器学习工具。

000

图2-8 TensorFlow Logo

在硬件层面上,谷歌在2016年推出了专门面向TensorFlow深度学习的专用处理芯片TPU(见图2-9)。相比于传统的图像处理器GPU,TPU的功耗更低,速度更快。著名的围棋软件AlphaGo也采用了TPU处理器,目前TPU也已经整合在谷歌云上,可供用户使用。

000

图2-9 谷歌公司推出的TPU芯片

2017年,谷歌针对移动端设备推出了TensorFlow Lite,可以让开发者在移动设备上部署人工智能软件。基于TensorFlow Lite的架构如图2-10所示,开发者可以让自己的模型在不同的移动端设备上运行,实现诸如计算机视觉、自然语言处理等各类机器学习应用。

000

图2-10 面向移动端的TensorFlow Lite架构图

为了方便开发者,TensorFlow除了提供了大量相关的配套教学材料以外,还集成了很多辅助工具。比如TensorFlow内部集成了可视化工具TensorBoard,可以方便开发者理解、调试与优化TensorFlow程序。图2-11为TensorBoard设置完成后的界面。

000

图2-11 TensorBoard界面示意图

在写作本书时,TensorFlow已经升级到了v2版本,这个版本相比于v1版本有了非常多的变化。虽然增加了从v1升级导致的迁移成本,但是TensorFlow 2中同时支持了很多高阶的API功能,对于初学者来说反而变得非常友好。本书以Macbook Pro为例介绍如何在你的计算机上安装TensorFlow 2.4,其他系统可使用类似方式或根据TensorFlow官网提示安装。

1. 使用pip安装

使用pip工具安装TensorFlow是最简便的方法,首先需确保你的计算机上的Python版本为3.5到3.8。

按照下列命令安装pip工具。

$ sudo easy_install --upgrade pip

查看对应的pip是否安装完毕。

$ pip3 -V # for Python 3.n

使用pip安装TensorFlow。要注意的是,由于TensorFlow的主服务器在海外,这里设置了清华大学的数据源以使安装过程更顺畅。

$ pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple tensorflow==2.4

如果希望卸载TensorFlow,则可执行下面对应的命令。

$ pip3 uninstall tensorflow

2. 使用Docker安装

Docker是一项主流的容器技术,可以对系统、软件、环境加以封装,比传统的虚拟机技术更为方便快捷。可以在Docker的官网上直接下载和你的计算机对应的Docker版本。

在Docker的资源库里已经有了TensorFlow的容器版本[1]。使用Docker安装是最简单的方案,它会直接在虚拟环境中运行,并且支持便捷地配置GPU。可以执行下面的命令来下载最新的TensorFlow容器镜像,并在8888端口上运行。安装完毕后,可以在“http://localhost:8888/”中开启网页。

$ docker pull tensorflow/tensorflow:latest # Download latest stable image
$ docker run -it -p 8888:8888 tensorflow/tensorflow:latest-jupyter

3. 验证安装是否成功

我们可以使用一小段代码来验证TensorFlow是否安装完毕。在已经安装TensorFlow的终端环境下输入Python命令,进入对应的Python环境,并输入以下代码。

import tensorflow as tf
print(tf.__version__)

如果此时终端能够正确输出版本号“2.4.0”,则说明TensorFlow已经安装正确。

2.2.2 TensorFlow实例:图像分类

图像分类是机器学习任务中非常常见的问题,这里我们查看一个TensorFlow的官方案例[2]:如何使用TensorFlow的高级接口Estimator来实现鸢尾花的图像分类。

鸢尾花有多种类型(见图2-12),可以通过花萼和花瓣的不同特征来加以区分。TensorFlow提供的数据集中包含了下面四个植物学特征。

  • 花萼长度(SepalLength)
  • 花萼宽度(SepalWidth)
  • 花瓣长度(PetalLength)
  • 花瓣宽度(PetalWidth)
000

图2-12 鸢尾花的不同类型

每一条数据也对应了一种鸢尾花分类的标签,如下所示。

  • 山鸢尾(Setosa)
  • 变色鸢尾(Versicolor)
  • 维吉尼亚鸢尾(Virginica)

基于这些信息,我们需要先定义一些常量用于后续的数据解析。

CSV_COLUMN_NAMES = ['SepalLength', 'SepalWidth', 'PetalLength', 'PetalWidth', 'Species']
SPECIES = ['Setosa', 'Versicolor', 'Virginica']

接着我们从本地读取训练和测试数据,并解析对应的数据特征,同时构建数据的标签部分。

train_path = "./iris_training.csv"
test_path = "./iris_test.csv"
train = pd.read_csv(train_path, names=CSV_COLUMN_NAMES, header=0)
test = pd.read_csv(test_path, names=CSV_COLUMN_NAMES, header=0)
train_y = train.pop('Species')
test_y = test.pop('Species')

这里使用深度神经网络模型作为分类器进行训练,包含一个输入层、两个隐含层以及一个输出层。其中输入层为设置好的特征列,隐含层分别有30个和10个单元,最后的输出层为三个节点,分别对应三个分类。TensorFlow的代码实现如下。

my_feature_columns = []
for key in train.keys():
    my_feature_columns.append(tf.feature_column.numeric_column(key=key))
classifier = tf.estimator.DNNClassifier(
    feature_columns=my_feature_columns,
    hidden_units=[30, 10],
    n_classes=3)

模型搭建完毕后就可以基于数据集进行训练了。

classifier.train(
    input_fn=lambda: input_fn(train, train_y, training=True),
    steps=5000)

最终对训练完毕的模型使用测试数据进行准确性的评估,这样,一整套基于深度模型的图像分类模型就搭建完毕了。

eval_result = classifier.evaluate(
    input_fn=lambda: input_fn(test, test_y, training=False))

在完成模型的训练后,我们可以对未知的数据进行预测分类。下面的代码提供了三个测试数据,并在训练完毕的分类器上测试模型的表现。

expected = ['Setosa', 'Versicolor', 'Virginica']
predict_x = {
    'SepalLength': [5.1, 5.9, 6.9],
    'SepalWidth': [3.3, 3.0, 3.1],
    'PetalLength': [1.7, 4.2, 5.4],
    'PetalWidth': [0.5, 1.5, 2.1],
}

def input_fn(features, batch_size=256):
    return tf.data.Dataset.from_tensor_slices(dict(features)).batch(batch_size)

predictions = classifier.predict(
    input_fn=lambda: input_fn(predict_x))

for pred_dict, expec in zip(predictions, expected):
    class_id = pred_dict['class_ids'][0]
    probability = pred_dict['probabilities'][class_id]
    print('Prediction is "{}" ({:.1f}%), expected "{}"'.format(
        SPECIES[class_id], 100 * probability, expec))

[1] https://hub.docker.com/r/tensorflow/tensorflow/

[2] https://www.tensorflow.org/tutorials/estimator/premade