深度学习与神经网络: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 条评论
登录 后参与评论

相关文章

来自专栏决胜机器学习

循环神经网络(一) ——循环神经网络模型与反向传播算法

循环神经网络(一) ——循环神经网络模型与反向传播算法 (原创内容,转载请注明来源,谢谢) 一、概述 这一章开始讲循环神经网络(RNN,Recurrent Ne...

3485
来自专栏weixuqin 的专栏

深度学习之 TensorFlow(五):mnist 的 Alexnet 实现

1533
来自专栏企鹅号快讯

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

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

4677
来自专栏PPV课数据科学社区

TensorFlow基本操作 实现卷积和池化

之前已经提到过图像卷积的操作和意义,并且用OpenCV中的filter2D函数实现了一些例子。OpenCV中的filter2D函数仅仅是用一个卷积核去卷积单个的...

712
来自专栏有趣的Python

TensorFlow应用实战-9-生成音乐

生成音乐的python文件 # -*- coding: UTF-8 -*- """ 用训练好的神经网络模型参数来作曲 """ import pickle i...

3335
来自专栏小小挖掘机

听说GAN很高大上,其实就这么简单

本文使用的tensorflow版本:1.4 tensorflow安装:pip install tensorflow 1、先来目睹一下效果吧 这篇文章讲解了如何使...

4504
来自专栏小小挖掘机

对抗思想与强化学习的碰撞-SeqGAN模型原理和代码解析

1、背景 GAN作为生成模型的一种新型训练方法,通过discriminative model来指导generative model的训练,并在真实数据中取得了很...

6918
来自专栏书山有路勤为径

回顾:训练神经网络

我们可以将这些单元神经元组合为层和堆栈,形成神经元网络。一个神经元层的输出变成另一层的输入。对于多个输入单元和输出单元,我们现在需要将权重表示为矩阵。

822

如何实现自然语言处理的集束搜索解码器

自然语言处理任务(例如字幕生成和机器翻译)涉及生成单词序列。

3278

在Python中用一个长短期记忆网络来演示记忆

长期短期记忆(LSTM)网络是一种能够在长序列上学习的递归神经网络。

56411

扫码关注云+社区