文档中心 智能钛机器学习平台 最佳实践 用 Notebook 实现手写数字识别

用 Notebook 实现手写数字识别

最近更新时间:2019-10-14 16:52:55

场景背景

手写数字识别是图像识别领域基本任务之一,旨在通过机器学习或深度学习算法将每张手写数字图片分类到0 - 9的数字标签中。在海量的手写数字图像数据集中,MNIST 数据集被学术界、工业界广泛研究。

本文通过智能钛机器学习平台提供的 Notebook,利用 TensorFlow 框架构建一个简单的神经网络来实现 MNIST 手写数字识别。通过本文的学习,您可了解到如何通过智能钛机器学习平台实现您自己的代码。

数据集介绍

用户可从 MNIST 官网 下载 MNIST 数据集,该数据集由来自250个不同人手写的数字构成,共包含60,000个训练数据,10,000个测试数据,每个数据都是一张28px * 28px大小的灰度图像,该图像空白像素标记为0,有笔迹的地方用0 - 1之间的数值标记笔迹颜色的深浅。手写数字图像示例如下:

整体流程

在智能钛机器学习平台提供的 Notebook 中完成手写数字识别的任务,我们需要完成以下几个步骤:

  1. 新建 Notebook 容器
  2. 在 Notebook 中,创建 MNIST 手写数字识别项目
    • 创建 Python 文件
    • 从 MNIST 官网下载数据集并上传到项目文件夹中
  3. 利用 TensorFlow 实现手写数字识别:
    • 安装并导入所需依赖包
    • 加载 MNIST 数据集
    • 数据集可视化展示
    • 构建手写数字识别模型
    • 模型评估输出模型准确率

详细流程

新建 Notebook 容器

  1. 登录智能钛机器学习平台控制台后,单击顶层菜单栏的【Notebook】,页面跳转至 Notebook 容器列表页面。单击【新增】,配置容器参数:
    • 容器名称:MNIST 手写数字识别
    • 框架选择:tensorflow/1.12
    • 资源选择:后付费/CPU/2核4G内存
    • 存储桶:此处请选择您自己在 COS 上的存储桶

  1. 待 Notebook 容器创建完成后状态为:运行中,单击【打开】进入 Notebook 操作页面

创建 MNIST 手写数字识别项目

  1. 在 Notebook 操作页面,选择【Python3】,进入项目后,将项目重命名为:MNIST.ipynb
  2. 在 MNIST.ipynb 的同级目录处,新建文件夹【MNIST_data】,并将 MNIST 官网 提供的四个数据集下载后上传至该文件夹中:
    • train-images-idx3-ubyte.gz
    • train-labels-idx1-ubyte.gz
    • t10k-images-idx3-ubyte.gz
    • t10k-labels-idx1-ubyte.gz

利用 TensorFlow 实现 MNIST 手写数字识别

  1. 在 Notebook 中安装并导入所需依赖包

    <!--您可直接复制以下所有代码块到 Notebook 中运行-->
    ! pip install --user --upgrade pip
    ! pip install --user tensorflow
    
    import matplotlib.pyplot as plt
    import tensorflow as tf
    from tensorflow.examples.tutorials.mnist import input_data
    from tensorflow.examples.tutorials.mnist import input_data
  2. 加载 MNIST 数据集

    mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
  3. 可视化查看数据内容
    选择数据集中的一个示例打印出来,查看数据内容。

    说明:

    此处打印的数据每次都是随机的,可能内容不一样。

为更直接查看数据图像内容,我们可将数据 reshape 成28 * 28的矩阵,然后打印一个黑白图片(Greys),同时输出查看该图片的标签(数字“8”的标签会在10维向量中第9位设置为1,其余为0)

  im = mnist.train.images[0].reshape(28, 28)
  plt.imshow(im, cmap='Greys')
  plt.show()
  print(mnist.train.labels[0])

  1. 搭建手写数字识别模型

    # 模型构建
    sess = tf.InteractiveSession()
    x = tf.placeholder(tf.float32, [None, 784])
    W = tf.Variable(tf.zeros([784,10]))
    b = tf.Variable(tf.zeros([10]))
    
    y = tf.nn.softmax(tf.matmul(x,W) + b)
    
    y_ = tf.placeholder(tf.float32, [None,10])
    cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y),reduction_indices=[1]))
    train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)
    
    # 模型训练
    tf.global_variables_initializer().run()
    
    for i in range(1000):
        batch_xs, batch_ys = mnist.train.next_batch(100)
        train_step.run({x: batch_xs, y_: batch_ys})
  2. 模型评估

    correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
    
    print('MNIST手写数字模型准确率:')
    print(accuracy.eval({x: mnist.test.images, y_: mnist.test.labels}))
注意:

由于随机因素的存在,模型每次运行准确率不一定完全一致

模型准确率输出可参考下图示例: