深度学习与神经网络:mnist数据集实现手写数字识别

大家好,在这一篇文章中,我们将做以下的三件事:

1:介绍mnist数据集的使用

2:创建模型,并且保存模型

3:在测试集中使用保存的模型进行检测

一:介绍mnist数据集的使用

对于mnist数据集,具体的一些介绍我这里就不搬运过来了,这里我直接说我们如何在TensorFlow上使用mnist数据集.

在我们将mnist数据集准备喂入神经网络时,我们需要提前对数据集进行处理,因为数据集的大小是28*28像素,我们就将每张图片处理成长度784的一维数组,将这个数组作为神经网络的训练特征喂入神经网络.

举个例子:

一张数字手写体图片变成长度为 784 的一维数组[0.0.0.0.0.231 0.235 0.459 ……0.219 0.0.0.0.]输入神经网络。该图片对应的标签为[0.0.0.0.0.0.1.0. 0.0],标签中索引号为 6 的元素为 1,表示是数字 6 出现的概率为 100%,则该图片对应的识别结果是6。

而在TensorFlow中,我们加载数据集的时候,是使用input_data的read_data_sets().

具体指令如下:

from tensorflow.examples.tutorials.mnist import input_data

mnist = input_data.read_data_sets(’./data/’,one_hot=True)

接着说说上边的指令:

在 read_data_sets()函数中有两个参数,第一个参数表示数据集存放路径,第二个参数表示数据集的存取形式。当第二个参数为 Ture 时,表示以独热码形式 存取数据集。read_data_sets()函数运行时,会检查指定路径内是否已经有数据 集,若指定路径中没有数据集,则自动下载,并将 mnist 数据集分为训练集 train、 验证集 validation 和测试集 test 存放。如图下所示:

二:创建模型,并且保存模型

在这个例子中,我们也是有三个过程,一个是前向传播,另外一个是反向传播,在反向传播中我们要用到正则化,指数衰减学习,滑动平均方法的设置,最后一个就是测试模块.

①:前向传播

关于前向传播的理论知识,有兴趣的小伙伴可以翻翻我之前的文章,那里有详细的介绍,这里只讲述在TensorFlow中,我们是如何使用前向传播过程完成神经网络的搭建.

大家在搭建前向传播时,其实可以遵照一些固定的结构:

在前向传播过程中,需要定义神经网络中的参数 w 和偏置 b,定义由输入到输出的 网络结构。通过定义函数 get_weight()实现对参数 w 的设置,包括参数 w 的形 状和是否正则化的标志。同样,通过定义函数 get_bias()实现对偏置 b的设置。

现在让我们创建一个:mnist_forward的py文件:

在这个代码里,我们完成了基本的网络搭建,是一个两层的神经网络,一层隐藏层,一层输出层.如果有兴趣的同学也可以自己调解下layer_node的个数或者是多加几层来看看效果怎么样.

②:反向传播

在使用反向传播时,我们也是有固定的结构:

反向传播过程中,用 tf.placeholder(dtype, shape)函数实现训练样本 x 和样 本标签 y_占位,函数参数 dtype 表示数据的类型,shape 表示数据的形状;y 表示定义的前向传播函数 forward;loss 表示定义的损失函数,一般为预测值与样 本标签的交叉熵(或均方误差)与正则化损失之和;train_step 表示利用优化算 法对模型参数进行优化

常 用 优 化 算 法 GradientDescentOptimizer 、 AdamOptimizer、MomentumOptimizer 算法,在上述代码中使用的 GradientDescentOptimizer 优化算法。

接着实例化 saver 对象,其中利用 tf.initialize _all_variables().run()函数实例化所有参数模型,利用 sess.run( )函数实现模型的训练优化过程,并每间隔一定轮数保存一次模型。

现在我们创建mnist_backward的py文件:

参照上述的代码文件,我们来说说如何在TensorFlow中使用正则化,指数衰减率和滑动平均.

①:正则化

在上文中提到过,我们在forward.py中设置了正则化,这表明在反向传播中我们\优化模型参数是,需要在损失函数中加入正则化:

结构如下:

首先在forward.py中提前声明:

if regularizer != None:

tf.add_to_collection('losses', tf.contrib.layers.l2_regularizer(regularizer)(w))

其次再在backward.py中声明:

ce = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y, labels=tf.argmax(y_, 1))

cem = tf.reduce_mean(ce)

loss = cem + tf.add_n(tf.get_collection('losses'))

这样我们就在反向传播中引入了正则化.

②:指数衰减学习率

在训练模型时,使用指数衰减学习率可以使模型在训练的前期快速收敛接近较优 解,又可以保证模型在训练后期不会有太大波动.

如果在TensorFlow中使用指数衰减学习率.我们要在backward.py中加入:

learning_rate = tf.train.exponential_decay(

LEARNING_RATE_BASE,

global_step,

LEARNING_RATE_STEP,

LEARNING_RATE_DECAY,

staircase=True)

③:滑动平均

在模型训练时引入滑动平均可以使模型在测试数据上表现的更加健壮。

在TensorFlow引入滑动平均需要加入:

ema = tf.train.ExponentialMovingAverage(MOVING_AVERAGE_DECAY, global_step)

ema_op = ema.apply(tf.trainable_variables())

with tf.control_dependencies([train_step, ema_op]):

train_op = tf.no_op(name='train')

经过上述的完善,我们的反向传播模型也已经基本搭建完成.

在我们运行backward.py之后,我们的模型会保存在当前目录里,接下来我们可以在测试集中调用我们所训练的模型:

三:在测试集中使用保存的模型进行检测

①:创建mnist_test.py

当神经网络模型训练完成后,便可用于测试数据集,验证神经网络的性能。结构如下:

通过对测试数据的预测得到准确率,从而判断出训练出的神经网络模型的性能好坏。当准确率低时,可能原因有模型需要改进,或者是训练数据量太少导致过拟合。

代码如下:

另外大家在使用pycharm运行这个文件时,会发生:

这样其实是没有运行到该文件的主函数,解决方法是:

将mnist_test添加至运行环境下:

这样即可运行.

四:运行结果:

1;运行backward.py:

误差总体是减小的,这里有些问题是因为我的训练次数太少.

2:运行test.py

在使用9000步的模型时,测试集达到的准确率是97.66%.

因此来看,模型具有一定的泛化能力.

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏目标检测和深度学习

手把手教你搭建目标检测器-附代码

1012
来自专栏企鹅号快讯

用keras搭建3D卷积神经网络

资源: 3D卷积神经网络相关博客:http://blog.csdn.net/lengxiaomo123/article/details/68926778 ker...

5227
来自专栏AI科技评论

深度丨机器学习零基础?手把手教你用TensorFlow搭建图像识别系统(三)

AI科技评论按:本文是介绍用TensorFlow构建图像识别系统的第三部分。 在前两部分中,我们构建了一个softmax分类器来标记来自CIFAR-10数据集的...

3416
来自专栏贾志刚-OpenCV学堂

干货 | Tensorflow设计简单分类网络实现猫狗图像分类训练与测试

第一层:32个feature map 5x5卷积、步长为2、最大值池化 局部相应归一化处理(LRN) 第二层:64个feature map 3x3卷积、步长为...

1194
来自专栏Small Code

【TensorFlow】TensorFlow 的卷积神经网络 CNN - 无TensorBoard版

前面 有篇博文讲了多层感知器,也就是一般的前馈神经网络,文章里使用 CIFAR10 数据集得到的测试准确率是 46.98%。今天我们使用更适合处理图像的卷积神经...

2427
来自专栏智能算法

深度学习三人行(第9期)----卷积神经网络实战进阶(附代码)

接下来我们一起学习下关于CNN的代码实现,内存计算和池化层等相关知识,我们多多交流,共同进步。本期主要内容如下:

653
来自专栏机器之心

资源 | GitHub新项目:轻松使用多种预训练卷积网络抽取图像特征

选自GitHub 机器之心整理 参与:思源 最近 GitHub 有一个非常有意思的项目,它可以使用多种预训练 TensorFLow 模型计算图像特征。对于每一个...

3006
来自专栏梦里茶室

Google机器学习笔记(七)TF.Learn 手写文字识别

mnist问题 计算机视觉领域的Hello world 给定55000个图片,处理成28*28的二维矩阵,矩阵中每个值表示一个像素点的灰度,作为feature...

2669
来自专栏机器学习、深度学习

人脸检测--SSH: Single Stage Headless Face Detector

SSH: Single Stage Headless Face Detector ICCV2017 https://github.com/mahyar...

5915
来自专栏机器学习算法全栈工程师

手把手教你搭建目标检测器-附代码

翻译:刘威威 编辑:祝鑫泉 前 言 本文译自:[http://www.hackevolve.com/create-your...

3324

扫码关注云+社区