(七)手写数字识别_线性回归、多层感知机、CNN实现

(七)手写数字识别_线性回归、多层感知机、CNN实现

以手写数字识别为出发点,对深度学习中的网络构建、预测分析、迭代优化等主要流程进行相关介绍。

一、前言

MNIST可以算的上是机器学习界的“Hello World”,感觉可以算是深度学习中一个很好的入门范例。MNIST数据集主要由一些手写数字的图片和相应的标签组成。图片一共10类,分别对应0-9,每张图片都是由28*28的矩阵表示。其中训练集一共60000张图片,测试集一共10000张图片,训练集又分出来5000张为验证集图片。如下所示:

  1. 数据集下载
    运行如下代码,会自动的将数据集下载到工程文件下的MNIST_data文件夹下,如果下载失败,也可以到该链接手动下载保存到本地[link]

    1
    2
    from tensorflow.examples.tutorials.mnist import input_data
    mnist = input_data.read_data_sets("MNIST_data", one_hot=True)
  2. 图片保存
    以上下载的数据集是向量集,如果想保存为具体的图片,可执行如下操作:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    from tensorflow.examples.tutorials.mnist import input_data
    from PIL import Image
    import os

    mnist = input_data.read_data_sets("../MNIST_data/", one_hot=True)
    # 如果没这个文件夹自动创建
    save_dir = '../MNIST_data/raw/'
    if os.path.exists(save_dir) is False:
    os.makedirs(save_dir)
    for i in range(20):
    image_array = mnist.train.images[i, :]
    image_array = image_array.reshape(28, 28)
    #MNIST数据集图片灰度值都是0或者1,这里乘以256便于直观化图像
    image_array *= 256
    filename = save_dir + 'mnist_train_%d.jpg' % i
    image = Image.fromarray(image_array);
    if image.mode == "F":
    image = image.convert('RGB')
    image.save(filename)
  3. 独热表示
    手写数字识别的标签是通过独热编码表示的。

    1
    2
    3
    4
    5
    6
    7
    8
    from tensorflow.examples.tutorials.mnist import input_data
    import numpy as np

    mnist = input_data.read_data_sets("../MNIST_data", one_hot=True)
    #看前20张训练图片的label for i in range(20):
    one_hot_label = mnist.train.labels[i, :]
    label = np.argmax(one_hot_label)
    print('mnist_train_%d.jpg label: %d' % (i, label))

二、线性回归识别MNIST

  • 原理
    因为是多分类问题,整体模型采用softmax回归;
    并用交叉熵作为概率分布的准确度估计;
    然后通过梯度下降迭代的进行训练;
    最后在测试集或验证集上对准确度进行评测。

  • 代码示例
    SR-mnist.py

  • 准确度
    0.91

三、多层感知机(MLT或FCN)识别MNIST

  • 原理
    softmax和传统的神经网络的区别是没有隐含层,拟合能力有限。同时隐含层越多,越容易拟合复杂函数。使用较多层次的神经网络越容易过拟合、参数难以调试、梯度弥散等。对于这些问题需要很多Trick来解决,比如Dropout、Adagrad、ReLU等。当引入隐含层并使用非线性激活函数后,就可以使用曲线来划分一些样本,可以轻松解决异或函数的分类问题,神经网络的隐含层越多,就可以对原有特征进行更抽象的变换,模型的拟合能力就越强。
    没有隐含层的Softmax Regression只能直接从图像的像素点推断出是哪个数字,而没有特征抽象的过程。多层神经网络依靠隐含层,可以组合出高阶特征,之后可以将这些高阶特征组合成数字,就能实现精准的匹配和分类。
    现在加上隐含层,并使用减轻过拟合的Dropout自适应学习速率的Adagrad、以及可以解决梯度弥散的激活函数ReLU
  • 代码示例
    MLT-mnist.py
  • 准确度
    0.978

四、CNN识别MNIST

  • 原理
    全连接的网络因为参数过多和梯度弥散等问题,在早期很难顺利地进行多层的训练,卷积神经网络可以利用空间结构关系减少需要学习的参数量,从而提高反向传播算法的训练效率。
    卷积神经网络的特点是局部连接(降低了参数量)、权值共享(赋予了对平移的容忍性)、池化层降采样(进一步降低参数量,赋予模型对轻度形变的容忍性)。
    leNet5示例图
  • 代码示例
    CNN-simple-mnist.py
  • 精确度
    0.992
# MNIST

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×