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

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,458评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,454评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,171评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,062评论 0 207
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,440评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,661评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,906评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,609评论 0 200
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,379评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,600评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,085评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,409评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,072评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,088评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,860评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,704评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,608评论 2 270

推荐阅读更多精彩内容