以手写数字识别为出发点,对深度学习中的网络构建、预测分析、迭代优化等主要流程进行相关介绍。
一、前言
MNIST可以算的上是机器学习界的“Hello World”,感觉可以算是深度学习中一个很好的入门范例。MNIST数据集主要由一些手写数字的图片和相应的标签组成。图片一共10类,分别对应0-9,每张图片都是由28*28的矩阵表示。其中训练集一共60000张图片,测试集一共10000张图片,训练集又分出来5000张为验证集图片。如下所示:

数据集下载
运行如下代码,会自动的将数据集下载到工程文件下的MNIST_data文件夹下,如果下载失败,也可以到该链接手动下载保存到本地[link]1
2from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data", one_hot=True)图片保存
以上下载的数据集是向量集,如果想保存为具体的图片,可执行如下操作:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19from 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)独热表示
手写数字识别的标签是通过独热编码
表示的。1
2
3
4
5
6
7
8from 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
- 原理
全连接的网络因为参数过多和梯度弥散等问题,在早期很难顺利地进行多层的训练,卷积神经网络可以利用空间结构关系减少需要学习的参数量,从而提高反向传播算法的训练效率。
卷积神经网络的特点是局部连接
(降低了参数量)、权值共享
(赋予了对平移的容忍性)、池化层降采样
(进一步降低参数量,赋予模型对轻度形变的容忍性)。 - 代码示例
CNN-simple-mnist.py - 精确度
0.992