利用神经网实现MNIST手写数字识别
1、实验描述
-
使用Python编程,输入为MNIST训练数据集,首先通过Tensorflow载入MNIST数据集并进行相应的特征提取等处理,其次采用Softmax
Regression算法对数据集进行概率估算,然后训练模型构建神经网络,通过评估来对模型进一步地调整优化,进而便可以根据优化的模型预测识别新的手写数字。 -
实验时长:45分钟
-
主要步骤:
-
MNIST数据集加载
-
Softmax Regression算法进行概率估算
-
训练测试模型构建神经网络
-
评估模型计算准确率
-
2、实验环境
-
系统版本:CentOS7
-
Python版本:3.6.5
-
Matplotlib版本:Matplotlib 2.2.2
-
Anaconda版本:Anaconda3.4.1
-
Numpy版本:1.14.3
-
scikit-learn版本:0.19.1
3、相关技能
-
Python编程
-
Softmax Regression构建神经网络
-
Tensorflow编程
4、相关知识点
-
MNIST概述
- MNIST是一个计算机视觉数据集,它包含70000张手写数字的灰度图片,其中每一张图片包含28*28个像素点。可以用一个数字数组来表示这张图片:
每一张图片都有对应的标签,也就是图片对应的数字,例如上面图片的标签为1。
- 数据集被分成两部分:60000行的训练数据集和10000行的测试数据集。其中:60000行的训练集分拆为55000行的训练集和5000行的验证集。
60000行的训练数据是一个形状为[60000,784]的张量,第一个维度数字用来索引图片,第二个维度数字用来索引每张图片中的像素点。在此张量里的每一个元素,都表示某张图片里的某个像素的强度值,值介于0和1之间。60000行的训练数据集标签是介于0到9的数字,用来描述给定图片里表示的数字,称为“one-hot
vectors”。一个one-hot向量除了某一位的数字是1以外,其余各维度数字都是0。
-
Tensorflow编程模型简介与使用
-
Tensorflow是一个采用数据流图,用于数值计算的开源软件库。节点在图中表示数学操作,图中的线则表示在节点间相互联系的多维数据数组,即张量。Tensorflow的计算表示为一个计算图,图中的每个节点可以有任意多个输入和输出,每个节点描述了一种运算操作。
-
在Tensorflow中,使用图(graph)来表示计算任务,在被称之为会话(session)的上下文(context)中执行图,使用tensor表示数据,通过变量(variable)维护状态,使用feed和fetch可以为任意的操作赋值或从其中获取数据。
-
Softmax Regression算法
-
Softmax
Regression是Logistic回归的推广,Logistic回归是处理二分类问题的,而Softmax
Regression是处理多分类问题的。Softmax
Regression将可以判定为某类的特征相加,然后将这些特征转化为判定是这一类的概率,估算这一类的概率,将概率最大的作为结果输出。求出以下的概率值:
损失函数为
其中I{·}是一个指示性函数,意思是大括号里的值为真时,该函数的结果为1,否则为0。
-
神经网络
-
神经网络是将许多个单一“神经元”联结在一起,一个“神经元”的输出是另一个“神经元”的输入。下图即为一个简单的神经网络:
圆圈表示神经网络的输入,标上“+1”的圆圈称为偏置节点。神经网络最左边的一层为输入层,最右边一层为输出层,中间所有节点组成一层叫做隐藏层。
- 神经网络主要包括三个部分:结构、激励函数、学习规则。对于一个神经网络,存在输入层、隐藏层和输出层。除了输入层,每一层的节点都包含一个非线性变换,使得神经网络可以拟合任意一个函数。对于每一层的神经元,都在激励函数的作用下工作,激励函数通常是sigmoid、tanh、relu等。另外,神经网络也存在不同的算法来训练学习,例如前馈型、反馈型和自组织。通过不断的学习,能够得到一个模型,对输入预测出一个期望的输出。
5、实现效果
- 神经网训练过程输出及最终结果如下图:
6、实验步骤
6.1进入/home/zkpk/pycharm-2017.3.5/bin目录,切换到root用户,输入密码(zkpk)