这篇文章给大家介绍怎么用Tensorflow完成手写数字识别,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
深度学习最经典的任务问题就是分类。通过分类,我们可以将照片中的数字,人脸,动植物等等分到它属于的那一类当中,完成识别。接下来,我就带着大家一起完成一个简单的程序,来实现经典问题手写数字识别。
数据集
我们第一步需要收集一堆手写数据,并且将每个手写数字都标号类别,用来做成数据集。对于深度学习而言,一般的数据集大小至少上万起。所以收集数据这个工作还是比较繁琐的。不过呢,有人已经帮我们弄好了数据集,这就是鼎鼎有名的MNIST数据集。
MNIST数据集是一个标准的手写数据集,如上图所示,数据集里面有六万个手写数字且都标记完全。其中有五万个手写数字作为训练集,另外一万作为测试集。
这里有一份传送门:
http://yann.lecun.com/exdb/mnist/
我们并不需要事先下载MNIST数据集,Tensorflow几行代码就可以搞定:
搭建网络
准备好了数据集之后,我们开始用Tensorflow搭建神经网络模型:
1.输入输出
tf.placeholder是占位符的意思,先把坑填好,之后会有数据填充进去。其中y_是输入对应的正确的数字标签,x就是手写数字照片。
2.网络主体
我们建立了一个四层全连接网络,每一层的网络宽度都是400。因为MNIST数据集的数字照片都是28*28的,所以第一层网络的权重的形状是[784,400],注意到我们使用了Dropout技术,所以代码中有tf.nn.dropout。对于最后一层我们用softmax技术,将对0-9数字的预测归一化,变成一个概率。
3.损失函数和优化器
对于损失函数,我们选择了平方差函数,其实就是线性规划。而优化器我们选择了Adam,是目前主流的优化器。
训练网络
1.初始化
我们在这里做了两件事情,一个是初始化网络中变量,第二个建立一个存储器,用来存储训练过程的一些变量。
2.训练
第一行的循环是控制循环的次数,我们使用了随机梯度训练,就是每次更新参数的时候并不是一次性把五万张照片一起塞进去,而是从中随机选出来作为一个batch来训练,这样的做的好处是可以大大减轻计算量。我们需要在每一步都在训练集上面训练来更新网络的参数,接着我们一定步骤后在测试集上面看看我们的训练效果。
3.执行程序
才开始训练集和测试集上的准确率是在10%附近,这是因为在网络的参数没有更新的时候,所有参数都是随机的,相当于我们在瞎猜。一共有十个数字,所以猜对的概率是十分之一。之后,随着训练的进行,训练集和测试集上的准确率都在增加。我们同时观察训练集和测试集上的准确率,是防止网络过拟合把我们欺骗了。
训练到一定步时,我们发现训练集的准确率已经接近百分之百了,测试集上的准确率也达到了百分之九十七以上。简简单单的四层就能做到如此之高的准确率,可见神经网络之神奇!
关于怎么用Tensorflow完成手写数字识别就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。