基于MNIST手写数字数据集的数字识别小程序

30行代码奉上!(MNIST手写数字的识别,识别率大约在91%,简单尝试的一个程序,小玩具而已)

 1 import tensorflow.examples.tutorials.mnist.input_data as input_data
 2 import tensorflow as tf
 3 mnist = input_data.read_data_sets(‘/temp/‘, one_hot=True)
 4
 5 #设置
 6 x = tf.placeholder(tf.float32,[None,784])
 7 W = tf.Variable(tf.zeros([784,10]))
 8 b = tf.Variable(tf.zeros([10]))
 9 #预测值
10 y = tf.nn.softmax(tf.matmul(x,W)+b)
11 #真值
12 y_ = tf.placeholder(tf.float32,[None,10])
13 #交叉熵
14 cross_entropy = -tf.reduce_sum(y_*tf.log(y))
15
16 #使用优化器
17 train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)
18 #初始化变量
19 init = tf.initialize_all_variables()
20 #创建对话
21 sess = tf.Session()
22 sess.run(init)
23
24
25 for i in range(1000):
26     batch_xs,batch_ys = mnist.train.next_batch(100)
27     sess.run(train_step,feed_dict={x:batch_xs,y_:batch_ys})
28
29 correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
30 accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
31 print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))
 1 import tensorflow.examples.tutorials.mnist.input_data as input_data
 2 import tensorflow as tf
 3 mnist = input_data.read_data_sets(‘/temp/‘, one_hot=True)

1~3行,主要的工作是引入tensorflow模块,并且下载MNIST数据集,这是tensorflow自带的下载器,可以自动下载数据集,我们主要重心不在这,所以就这样简单代过。
#设置
 6 x = tf.placeholder(tf.float32,[None,784])
 7 W = tf.Variable(tf.zeros([784,10]))
 8 b = tf.Variable(tf.zeros([10]))
 9 #预测值
10 y = tf.nn.softmax(tf.matmul(x,W)+b)
11 #真值
12 y_ = tf.placeholder(tf.float32,[None,10])

6~12行首先是设置输入输出,还有精确值作为学习目标,此外还有权重和偏置,就这样构建一个计算图,图的样子大概是这样的:

其中x作为输入是一个1x768的向量,然后就是经过权重和偏食,就得到10个输出,然后用softmax()进行预测值的输出。

此外y_作为真值,要用到一个占位符。

主要用到的tensorflow的函数有

tf.placeholder    设置一个占位符,用于设置输入
tf.Variable      设置一个变量,用于设置权重和偏置
tf.nn.softmax     softmax回归函数
tf.matmul        实现矩阵相乘
13 #交叉熵
14 cross_entropy = -tf.reduce_sum(y_*tf.log(y))
15
16 #使用优化器
17 train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)
18 #初始化变量
19 init = tf.initialize_all_variables()
20 #创建对话
21 sess = tf.Session()
22 sess.run(init)
使用交叉熵作为误差评判标准,并以此来实现随机梯度下降。交叉熵函数公式如下:

这里使用了tensorflow的函数:
tf.reduce_sum      求和
tf.log          求对数

17行就是创建一个优化器,使用随机梯度下降的方法并根据交叉熵进行网络权重和偏置的优化训练。这里使用的参数是学习率,设为0.01。tensorflow函数:
tf.train.GradientDescentOptimizer(learnrate)  创建一个优化器对象,使用的是随机梯度下降的方法,参数可以设置学习率
tf.train.GradientDescentOptimizer对象的minimize()方法  指定损失函数才能进行优化
19~22行是前面设置的变量的初始化工作,这里需要创建一个Session对话,tensorflow所有运算操作都是需要Session对话来进行的,此外还需要对所有变量初始化。
tensorflow函数:
tf.initialize_all_variables()    创建一个初始化所有变量的对象
tf.Session()              创建一个Session对话
sess.run()                Session对话指定执行操作

25 for i in range(1000):
26     batch_xs,batch_ys = mnist.train.next_batch(100)
27     sess.run(train_step,feed_dict={x:batch_xs,y_:batch_ys})
28
29 correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
30 accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
31 print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))

25~27行就是训练过程,一共迭代一千次,每次送入小批量一百个数据,这里使用数据集的函数
mnist.train.next_batch  可以返回一个小批数据集然后就是Session对话的run()函数,指定优化器的运行,还有feed_dict送入数据字典的指定,上述代码指定输出小批量的数据。

29~31行就是输出识别结果,其中用到tensorflow函数:
tf.argmax        返回的是vector中的最大值的索引号
tf.equal        判断是否相等
tf.reduce_mean    求均值
tf.cast        类型转换
输出:0.9187表示识别率达到91.87%,但是没什么卵用,还是很糟糕的结果,模型太简单了,不过通过这样的学习,可以大概基础地入门tensorflow的坑。接下来我将继续深入tensorflow的坑!
 
 

原文地址:https://www.cnblogs.com/shuaiqi-XCJ/p/9637765.html

时间: 2024-07-31 20:34:24

基于MNIST手写数字数据集的数字识别小程序的相关文章

Tensorflow实践 mnist手写数字识别

minst数据集                                         tensorflow的文档中就自带了mnist手写数字识别的例子,是一个很经典也比较简单的入门tensorflow的例子,非常值得自己动手亲自实践一下.由于我用的不是tensorflow中自带的mnist数据集,而是从kaggle的网站下载下来的,数据集有些不太一样,所以直接按照tensorflow官方文档上的参数训练的话还是踩了一些坑,特此记录. 首先从kaggle网站下载mnist数据集,一份是

tensorflow 基础学习五:MNIST手写数字识别

MNIST数据集介绍: from tensorflow.examples.tutorials.mnist import input_data # 载入MNIST数据集,如果指定地址下没有已经下载好的数据,tensorflow会自动下载数据 mnist=input_data.read_data_sets('.',one_hot=True) # 打印 Training data size:55000. print("Training data size: {}".format(mnist.

matlab练习程序(神经网络识别mnist手写数据集)

记得上次练习了神经网络分类,不过当时应该有些地方写的还是不对. 这次用神经网络识别mnist手写数据集,主要参考了深度学习工具包的一些代码. mnist数据集训练数据一共有28*28*60000个像素,标签有60000个. 测试数据一共有28*28*10000个,标签10000个. 这里神经网络输入层是784个像素,用了100个隐含层,最终10个输出结果. arc代表的是神经网络结构,可以增加隐含层,不过我试了没太大效果,毕竟梯度消失. 因为是最普通的神经网络,最终识别错误率大概在5%左右. 迭

安装MXnet包,实现MNIST手写数体识别

我想写一系列深度学习的简单实战教程,用mxnet做实现平台的实例代码简单讲解深度学习常用的一些技术方向和实战样例.这一系列的主要内容偏向于讲解实际的例子,从样例和代码里中学习解决实际问题.我会默认读者有一定神经网络和深度学习的基础知识,读者在这里不会看到大段推导和理论阐述.基础理论知识十分重要,如果读者对理论知识有兴趣,可以参看已有的深度学习教程补充和巩固理论基础,这里http://deeplearning.net/reading-list/tutorials/有一些不错的理论教程,相关的理论知

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

tensorflow笔记(四)之MNIST手写识别系列一 版权声明:本文为博主原创文章,转载请指明转载地址 http://www.cnblogs.com/fydeblog/p/7436310.html 前言 这篇博客将利用神经网络去训练MNIST数据集,通过学习到的模型去分类手写数字. 我会将本篇博客的jupyter notebook放在最后,方便你下载在线调试!推荐结合官方的tensorflow教程来看这个notebook! 1. MNIST数据集的导入 这里介绍一下MNIST,MNIST是在

Haskell手撸Softmax回归实现MNIST手写识别

Haskell手撸Softmax回归实现MNIST手写识别 前言 初学Haskell,看的书是Learn You a Haskell for Great Good, 才刚看到Making Our Own Types and Typeclasses这一章. 为了加深对Haskell的理解,便动手写了个Softmax回归.纯粹造轮子,只用了base. 显示图片虽然用了OpenGL,但是本文不会提到关于OpenGL的内容.虽说是造轮子, 但是这轮子造得还是使我受益匪浅.Softmax回归方面的内容参考

Tensorflow编程基础之Mnist手写识别实验+关于cross_entropy的理解

好久没有静下心来写点东西了,最近好像又回到了高中时候的状态,休息不好,无法全心学习,恶性循环,现在终于调整的好一点了,听着纯音乐突然非常伤感,那些曾经快乐的大学时光啊,突然又慢慢的一下子出现在了眼前,不知道我大学的那些小伙伴们现在都怎么样了,考研的刚刚希望他考上,实习的菜头希望他早日脱离苦海,小瑞哥希望他早日出成果,范爷熊健研究生一定要过的开心啊!天哥也哥早日结婚领证!那些回不去的曾经的快乐的时光,你们都还好吗! 最近开始接触Tensorflow,可能是论文里用的是这个框架吧,其实我还是觉得py

win10下通过Anaconda安装TensorFlow-GPU1.3版本,并配置pycharm运行Mnist手写识别程序

折腾了一天半终于装好了win10下的TensorFlow-GPU版,在这里做个记录. 准备安装包: visual studio 2015: Anaconda3-4.2.0-Windows-x86_64: pycharm-community: CUDA:cuda_8.0.61_win10:下载时选择 exe(local) CUDA补丁:cuda_8.0.61.2_windows: cuDNN:cudnn-8.0-windows10-x64-v6.0;如果你安装的TensorFlow版本和我一样1.

放弃antd table,基于React手写一个虚拟滚动的表格

缘起 标题有点夸张,并不是完全放弃antd-table,毕竟在react的生态圈里,对国人来说,比较好用的PC端组件库,也就antd了.即便经历了2018年圣诞彩蛋事件,antd的使用者也不仅不减,反而有所上升. 客观地说,antd是开源的,UI设计得比较美观(甩出其他组件库一条街),而且是蚂蚁金服的体验技术部(一堆p7,p8,p9,基本都是大牛级的)在持续地开发维护,质量可以信任. 不过,antd虽好,但一些组件在某一些场景下,是很不适用的.例如,以表格形式无限滚动地展示大量数据(1w+)时,