基于滴滴云 GPU 实现简单 MINIST 手写识别

1. TensorFlow 与 MNIST

TensorFlow 是谷歌于 2015 年 11 月 9 日正式开源的计算框架,可以很好地支持机器学习的各种算法,其灵活的架构可以在多种平台上展开计算,例如CPU或GPU台式机、服务器,移动设备等等。

MNIST 是机器学习领域的一个经典入门 Demo,数据集是由 6 万张训练图片和 1 万张测试图片构成,期望效果是让机器识别一系列大小为 28x28 像素的手写数字灰度图像,并判断这些图像代表 0-9 中的哪一个数字。

2. 创建 GPU 云主机

本文使用滴滴云 GPU P4 服务器,主要创建过程配置如下。

 选择 GPU 服务器和默认已安装显卡驱动的 Centos7.3 镜像:本次测试选择 8 核 CPU,16G 内存和 80G SDD 云盘作为系统盘:详细步骤可点击以下链接参考滴滴云官网教程:https://help.didiyun.com/hc/kb/article/1146353/

远程 SSH 连接云主机后,输入 `sudo su` 切换至 root 用户,输入 `nvidia-smi` 查看输出确认显卡驱动是否已安装:

3. 安装 TensorFlow

滴滴云 GPU 虚拟主机预装了 Python2.7 和 PIP,可以直接用 PIP 安装 TensorFlow:如果看到以下输出说明 TensorFlow 安装成功4. 下载 MNIST 数据集

MNIST 数据集可在 http://yann.lecun.com/exdb/mnist/  获取,它包含了四个部分:4. 下载 MNIST 数据集

MNIST 数据集可在 http://yann.lecun.com/exdb/mnist/  获取,它包含了四个部分:

1. train-images-idx3-ubyte.gz:  训练图片

2. train-labels-idx1-ubyte.gz:  训练标签

3. t10k-images-idx3-ubyte.gz:   测试图片

4. t10k-labels-idx1-ubyte.gz:   测试标签

将以上文件保存在 /tmp 目录下。

这些文件并不是标准的图片格式,因此无法直接展示,需要单独的程序来读取,下面我们以 train-images-idx3-ubyte.gz 为例,用一个 Python 程序将其中的内容转换为普通的 BMP 格式图片。

首先将 train-images-idx3-ubyte.gz 解压到另外的文件夹,因为后面 TensorFlow 用来训练这些数据是是不需要解压的:

这些文件并不是标准的图片格式,因此无法直接展示,需要单独的程序来读取,下面我们以 train-images-idx3-ubyte.gz 为例,用一个 Python 程序将其中的内容转换为普通的 BMP 格式图片。

首先将 train-images-idx3-ubyte.gz 解压到另外的文件夹,因为后面 TensorFlow 用来训练这些数据是是不需要解压的:

5. 训练与识别

接下来在 Python 中运行图片训练与识别的代码。

加载数据集并使用 one-hot 编码:导入 TensorFlow 库,并创建一个 InteractiveSession,这种交互式会话会指定当前会话为默认会话,之后的运算也会在当前会话运行。

之后创建一个 placeholder 即占位符,可以理解为数据的入口,其中第一个参数是数据类型,为 float32,第二个参数为数据的尺寸,none 表示输入图像数量不唯一,784 表示 MNIST 图像的 784 个像素点,y_ 为图像的标签。此处的数据即为 TensorFlow 中的 Tensor ( 张量 ),可简单理解为多维数组。

接下来定义 Softmax 回归模型中的 weights(权重)和 biases(偏置值)创建 Variable 对象。

本文侧重于 MNIST 数据集在滴滴云 GPU 服务器的训练演示,对 Softmax 回归模型不做展开讨论,可以简单理解为 w 是一个 784x10 的矩阵,因为我们有 784 个输入特征和 10 个输出类别(0~9),b 是一个大小为 10 的向量,代表 10 各类别:训练完成后,对模型的准确率进行验证。

以下代码中 tf.argmax(y,1) 是指经过学习后判断图中数字最可能的值,tf.argmax(y_,1) 是图片中数字的真实值,tf.equal 检查判断值和真实值是否相等:我们可以看到准确率为 92.53%。

输入AI大师码【1122】,滴滴云GPU全线产品享9折优惠。