固定链接 基于滴滴云 GPU 实现简单 MINIST 手写识别

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

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

1. TensorFlow 与 MNIST

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

MNIST 是机器学习领域的一个经典入门 Demo,数据集是由 6 万张训练图片和 1 万张测试图片构成,期望效果是让机器识别一系列大小为 28×28 像素的手写数字灰度图像,并判断这些图像代表 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 安装成功:

测试 TensorFlow:

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 用来训练这些数据是是不需要解压的:

在 /home/dc2-user 下创建一个新的文件夹 training,将转换格式后的图片放入此文件夹中,以下为转换文件格式的 Python 代码:

转换完成后,我们可以随便打开两张图片看一下效果:

    

数据集中的每张图片是 28×28 像素,即 784 个像素点。

5. 训练与识别

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

加载数据集并使用 one-hot 编码:

导入 TensorFlow 库,并创建一个 InteractiveSession,这种交互式会话会指定当前会话为默认会话,之后的运算也会在当前会话运行。

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

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

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

接下来就是实现 Softmax 回归算法,公式 y = softmax(Wx + b):

为了训练模型,需要定义一个 loss 函数,loss 表示模型的预测在一个单一例子上的准确程度,本例中使用 Cross-entropy(交叉熵)函数。交叉熵刻画的是实际输出(概率)与期望输出(概率)的距离,也就是交叉熵的值越小,两个概率分布就越接近:

使用 TensorFlow 的内置最快速梯度下降法,0.5 的步长,来下降交叉熵:

初始化全局参数并执行其 run 方法:

迭代执行训练操作 train_step,每次随机抽取 100 样本构成一个 batch,一共进行 10000 组训练:

训练完成后,对模型的准确率进行验证。

以下代码中 tf.argmax(y,1) 是指经过学习后判断图中数字最可能的值,tf.argmax(y_,1) 是图片中数字的真实值,tf.equal 检查判断值和真实值是否相等:

我们可以看到准确率为 92.53%。

本文作者:贺子一

您的留言将激励我们越做越好