深度学习与神经网络: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%.

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

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏新智元

猫狗大战识别准确率直冲 Kaggle Top 2%,手把手教你在 Keras 搭建深度 CNN

猫狗大战 数据集来自 kaggle 上的一个竞赛:Dogs vs. Cats,训练集有25000张,猫狗各占一半。测试集12500张,没有标定是猫还是狗。 ?...

83470
来自专栏大数据挖掘DT机器学习

Tensorflow:基于LSTM轻松生成各种古诗

RNN不像传统的神经网络-它们的输出输出是固定的,而RNN允许我们输入输出向量序列。RNN是为了对序列数据进行建模而产生的。 样本序列性:样本间存在顺序关系,...

54060
来自专栏Python中文社区

支持向量机原理推导(二)

專 欄 ❈ exploit,Python中文社区专栏作者。希望与作者交流或者对文章有任何疑问的可以与作者联系: Email: 15735640998@163....

20750
来自专栏fangyangcoder

tensorflow笔记(四)之MNIST手写识别系列一

http://www.cnblogs.com/fydeblog/p/7436310.html

15110
来自专栏Petrichor的专栏

深度学习: 经典 数据集 汇总

官网:www.cs.toronto.edu/~kriz/cifar 介绍:CIFAR-10数据集说明、TensorFlow CNN 测试CIFAR-10数据...

58430
来自专栏企鹅号快讯

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

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

82870
来自专栏AILearning

卷积神经网络

注意:本教程面向TensorFlow 的高级用户,并承担机器学习方面的专业知识和经验。 概观 CIFAR-10分类是机器学习中常见的基准问题。问题是将R...

244100
来自专栏GAN&CV

手把手教你创建自己的object detector

本文译自:http://www.hackevolve.com/create-your-own-object-detector/

18410
来自专栏梦里茶室

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

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

31990
来自专栏AI科技评论

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

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

39160

扫码关注云+社区

领取腾讯云代金券