matlab朴素贝叶斯手写数字识别_如何用Tensorflow完成手写数字识别?

前言

深度学习最经典的任务问题就是分类。通过分类,我们可以将照片中的数字,人脸,动植物等等分到它属于的那一类当中,完成识别。接下来,我就带着大家一起完成一个简单的程序,来实现经典问题手写数字识别。

8132fee3b2d31bf0fe7b6bd57d443405.png

数据集

606c1d4566e1a201193d10b1bbd97c1d.png

我们第一步需要收集一堆手写数据,并且将每个手写数字都标号类别,用来做成数据集。对于深度学习而言,一般的数据集大小至少上万起。所以收集数据这个工作还是比较繁琐的。不过呢,有人已经帮我们弄好了数据集,这就是鼎鼎有名的MNIST数据集。

MNIST数据集是一个标准的手写数据集,如上图所示,数据集里面有六万个手写数字且都标记完全。其中有五万个手写数字作为训练集,另外一万作为测试集。

这里有一份传送门:

http://yann.lecun.com/exdb/mnist/

我们并不需要事先下载MNIST数据集,Tensorflow几行代码就可以搞定

1ef8a42ab9bd9fbbcd0a6b6eabe20c1a.png

搭建网络

准备好了数据集之后,我们开始用Tensorflow搭建神经网络模型:

1.输入输出

b13d65cfae0c0f24792daf459ee0d251.png

tf.placeholder是占位符的意思,先把坑填好,之后会有数据填充进去。其中y_是输入对应的正确的数字标签,x就是手写数字照片。

2.网络主体

aef8d3f3e6dc6bda72ae4e710a36ead5.png

我们建立了一个四层全连接网络,每一层的网络宽度都是400。因为MNIST数据集的数字照片都是28*28的,所以第一层网络的权重的形状是[784,400],注意到我们使用了Dropout技术,所以代码中有tf.nn.dropout。对于最后一层我们用softmax技术,将对0-9数字的预测归一化,变成一个概率。

3.损失函数和优化器

14511d0bafd08a0d68e91cc0b53f1b7b.png

对于损失函数,我们选择了平方差函数,其实就是线性规划。而优化器我们选择了Adam,是目前主流的优化器。

训练网络

1.初始化

86cc137dd187432ce8f008d144811136.png

我们在这里做了两件事情,一个是初始化网络中变量,第二个建立一个存储器,用来存储训练过程的一些变量。

2.训练

8baa4a364b83764696fdf130bf22a4a3.png

第一行的循环是控制循环的次数,我们使用了随机梯度训练,就是每次更新参数的时候并不是一次性把五万张照片一起塞进去,而是从中随机选出来作为一个batch来训练,这样的做的好处是可以大大减轻计算量。我们需要在每一步都在训练集上面训练来更新网络的参数,接着我们一定步骤后在测试集上面看看我们的训练效果。

3.执行程序

e0d37869f45368e47d691771401f1084.png

才开始训练集和测试集上的准确率是在10%附近,这是因为在网络的参数没有更新的时候,所有参数都是随机的,相当于我们在瞎猜。一共有十个数字,所以猜对的概率是十分之一。之后,随着训练的进行,训练集和测试集上的准确率都在增加。我们同时观察训练集和测试集上的准确率,是防止网络过拟合把我们欺骗了。

4a1f2c8590072f78244559c22d4f6c23.png

训练到一定步时,我们发现训练集的准确率已经接近百分之百了,测试集上的准确率也达到了百分之九十七以上。简简单单的四层就能做到如此之高的准确率,可见神经网络之神奇!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值