2.2 TensorFlow基础入门
2.2.1 TensorFlow简介与安装
TensorFlow(见图2-8)是目前行业中最著名的机器学习框架之一,由谷歌大脑团队研发并在2015年开源,开发团队的机器学习研发能力很强,项目一直处于稳定的更新中。TensorFlow的开发者社区同样也非常活跃,目前网络上大量的机器学习开源项目均是用TensorFlow开发完成的,大量的企业也开始把TensorFlow作为标准化的机器学习工具。
图2-8 TensorFlow Logo
在硬件层面上,谷歌在2016年推出了专门面向TensorFlow深度学习的专用处理芯片TPU(见图2-9)。相比于传统的图像处理器GPU,TPU的功耗更低,速度更快。著名的围棋软件AlphaGo也采用了TPU处理器,目前TPU也已经整合在谷歌云上,可供用户使用。
图2-9 谷歌公司推出的TPU芯片
2017年,谷歌针对移动端设备推出了TensorFlow Lite,可以让开发者在移动设备上部署人工智能软件。基于TensorFlow Lite的架构如图2-10所示,开发者可以让自己的模型在不同的移动端设备上运行,实现诸如计算机视觉、自然语言处理等各类机器学习应用。
图2-10 面向移动端的TensorFlow Lite架构图
为了方便开发者,TensorFlow除了提供了大量相关的配套教学材料以外,还集成了很多辅助工具。比如TensorFlow内部集成了可视化工具TensorBoard,可以方便开发者理解、调试与优化TensorFlow程序。图2-11为TensorBoard设置完成后的界面。
图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)
图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