Mnist手写数字识别

前言

Mnist数据集可以从官网下载,网址: http://yann.lecun.com/exdb/mnist/ 下载下来的数据集被分成两部分: 55000行的训练数据集(mnist.train) 和10000行的测试数据集(mnist.test) 。每一个MNIST数据单元有两部分组成: 一张包含手写数字的图片和一个对应的标签。我们把这些图片设为“xs",把这些标签设为"ys"。训练数据集和测试数据集都包含xs和ys,比如训练数据集的图片是mnist.train.images,训练数据集的标签是mnist.train.labels.

分析

我们可以知道图片是黑白图片,每一张图片包含28像素X28像素。我们把这个数组展开成一个向量,长度是28x28= 784。因此,在MNIST训练数据集中,mnist.train.images 是一个形状为[55000, 784]的张量。(55000张图片,784个特征值)

MNIST中的每个图像都具有相应的标签,0到9之间的数字表示图像中绘制的数字。用的是one-hot编码nn[0, 0,0, 1, 0,0, 0, 0,0, 0] mnist. train. labels [55000, 10](10个目标数据,“0”,“1”,…,“9”)

代码演示


import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'from tensorflow.examples.tutorials.mnist import input_datadef full_connect():'''利用mnist数据集,实现手写数字识别:return: None'''# 获取数据mnist = input_data.read_data_sets("./data/mnist/input_data", one_hot=True)# 建立数据的占位符 x[None,784](特征值) y_true[None,10](目标值)with tf.variable_scope("data"):x = tf.placeholder(tf.float32,[None,784])# one-hot编码类型y_true = tf.placeholder(tf.int32,[None,10])# 建立全连接层的神经网络 weight [784,10](权重) bias[10](偏置)with tf.variable_scope("fc_model"):# 随机初始化权重和偏置weight = tf.Variable(tf.random_normal([784,10],mean=0.0,stddev=1.0),name="weight")bias = tf.Variable(tf.constant(0.0,shape=[10]))# 预测None个样本输出结果(matrix) [None,784] * [784,10]+ [10] = [None,10]y_predict = tf.matmul(x,weight) + bias# 求出所有样本损失,计算平均值with tf.variable_scope("soft_cros"):# 计算平均交叉熵损失loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_true,logits=y_predict))# 梯度下降求出损失with tf.variable_scope("optimizer"):train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)# 计算准确率with tf.variable_scope("accuracy"):# 进行比较equal_list = tf.equal(tf.argmax(y_true,1),tf.argmax(y_predict,1))# 求平均值 equal_list None个样本 类似:【1,0,1,1,1,0....,1,0】accuracy = tf.reduce_mean(tf.cast(equal_list,tf.float32))# 定义一个初始化变量的opinit_op = tf.global_variables_initializer()#开启会话训练with tf.Session() as sess:# 初始化变量sess.run(init_op)# 迭代,进行训练,更新参数预测for i in range(2000):# 从数据中取出真实存在的特征值和目标值mnist_x , mnist_y = mnist.train.next_batch(50)# 进行训练sess.run(train_op,feed_dict={x:mnist_x,y_true:mnist_y})print("训练第%d步,准确率为%f" % (i, sess.run(accuracy,feed_dict={x:mnist_x,y_true:mnist_y})))# print("训练第%d步,准确率为:%f" % (i, sess.run(accuracy, feed_dict={x: mnist_x, y_true: mnist_y})))return Noneif __name__ == "__main__":full_connect()

因为数据太多,我们不可能在控制台打印出所有数据,所以我们只在控制台打印出准确率,其他数据通过tensorboard观察。

收集变量,并添加如下代码,在会话开启之前:

    # 收集变量 单个数值收集tf.summary.scalar("losses",loss)tf.summary.scalar("accuracy",accuracy)#高纬度变量收集tf.summary.histogram("weight",weight)tf.summary.histogram("bias",bias)#定义一个合并变量的opmerged = tf.summary.merge_all()

并在会话中添加如下代码:

            #写入每一步训练的值summary = sess.run(merged,feed_dict={x:mnist_x,y_true:mnist_y})filewriter.add_summary(summary,i)

最终代码


import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'from tensorflow.examples.tutorials.mnist import input_datadef full_connect():'''利用mnist数据集,实现手写数字识别:return: None'''# 获取数据mnist = input_data.read_data_sets("./data/mnist/input_data", one_hot=True)# 建立数据的占位符 x[None,784](特征值) y_true[None,10](目标值)with tf.variable_scope("data"):x = tf.placeholder(tf.float32,[None,784])# one-hot编码类型y_true = tf.placeholder(tf.int32,[None,10])# 建立全连接层的神经网络 weight [784,10](权重) bias[10](偏置)with tf.variable_scope("fc_model"):# 随机初始化权重和偏置weight = tf.Variable(tf.random_normal([784,10],mean=0.0,stddev=1.0),name="weight")bias = tf.Variable(tf.constant(0.0,shape=[10]))# 预测None个样本输出结果(matrix) [None,784] * [784,10]+ [10] = [None,10]y_predict = tf.matmul(x,weight) + bias# 求出所有样本损失,计算平均值with tf.variable_scope("soft_cros"):# 计算平均交叉熵损失loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_true,logits=y_predict))# 梯度下降求出损失with tf.variable_scope("optimizer"):train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)# 计算准确率with tf.variable_scope("accuracy"):# 进行比较equal_list = tf.equal(tf.argmax(y_true,1),tf.argmax(y_predict,1))# 求平均值 equal_list None个样本 类似:【1,0,1,1,1,0....,1,0】accuracy = tf.reduce_mean(tf.cast(equal_list,tf.float32))# 定义一个初始化变量的opinit_op = tf.global_variables_initializer()# 收集变量 单个数值收集tf.summary.scalar("losses",loss)tf.summary.scalar("accuracy",accuracy)#高纬度变量收集tf.summary.histogram("weight",weight)tf.summary.histogram("bias",bias)#定义一个合并变量的opmerged = tf.summary.merge_all()#开启会话训练with tf.Session() as sess:# 初始化变量sess.run(init_op)# 建立events文件,然后写入filewriter = tf.summary.FileWriter("./tmp/summary/test/",graph=sess.graph)# 迭代,进行训练,更新参数预测for i in range(2000):# 从数据中取出真实存在的特征值和目标值mnist_x , mnist_y = mnist.train.next_batch(50)# 进行训练sess.run(train_op,feed_dict={x:mnist_x,y_true:mnist_y})#写入每一步训练的值summary = sess.run(merged,feed_dict={x:mnist_x,y_true:mnist_y})filewriter.add_summary(summary,i)print("训练第%d步,准确率为%f" % (i, sess.run(accuracy,feed_dict={x:mnist_x,y_true:mnist_y})))# print("训练第%d步,准确率为:%f" % (i, sess.run(accuracy, feed_dict={x: mnist_x, y_true: mnist_y})))return Noneif __name__ == "__main__":full_connect()


最终代码


import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'from tensorflow.examples.tutorials.mnist import input_dataFLAGS = tf.app.flags.FLAGS
tf.app.flags.DEFINE_integer("is_train", 1, "指定程序是预测还是训练")def full_connect():'''利用mnist数据集,实现手写数字识别:return: None'''# 获取数据mnist = input_data.read_data_sets("./tmp/data/mnist/input_data", one_hot=True)# 建立数据的占位符 x[None,784](特征值) y_true[None,10](目标值)with tf.variable_scope("data"):x = tf.placeholder(tf.float32,[None,784])# one-hot编码类型y_true = tf.placeholder(tf.int32,[None,10])# 建立全连接层的神经网络 weight [784,10](权重) bias[10](偏置)with tf.variable_scope("fc_model"):# 随机初始化权重和偏置weight = tf.Variable(tf.random_normal([784,10],mean=0.0,stddev=1.0),name="weight")bias = tf.Variable(tf.constant(0.0,shape=[10]))# 预测None个样本输出结果(matrix) [None,784] * [784,10]+ [10] = [None,10]y_predict = tf.matmul(x,weight) + bias# 求出所有样本损失,计算平均值with tf.variable_scope("soft_cros"):# 计算平均交叉熵损失loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_true,logits=y_predict))# 梯度下降求出损失with tf.variable_scope("optimizer"):train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)# 计算准确率with tf.variable_scope("accuracy"):# 进行比较equal_list = tf.equal(tf.argmax(y_true,1),tf.argmax(y_predict,1))# 求平均值 equal_list None个样本 类似:【1,0,1,1,1,0....,1,0】accuracy = tf.reduce_mean(tf.cast(equal_list,tf.float32))# 定义一个初始化变量的opinit_op = tf.global_variables_initializer()# 收集变量 单个数值收集tf.summary.scalar("losses",loss)tf.summary.scalar("accuracy",accuracy)#高纬度变量收集tf.summary.histogram("weight",weight)tf.summary.histogram("bias",bias)# 定义一个合并变量的opmerged = tf.summary.merge_all()# 创建一个saversaver = tf.train.Saver()#开启会话训练with tf.Session() as sess:# 初始化变量sess.run(init_op)# 建立events文件,然后写入filewriter = tf.summary.FileWriter("./tmp/summary/test/",graph=sess.graph)if FLAGS.is_train ==1:# 迭代,进行训练,更新参数预测for i in range(10000):# 从数据中取出真实存在的特征值和目标值mnist_x, mnist_y = mnist.train.next_batch(50)# 进行训练sess.run(train_op, feed_dict={x: mnist_x, y_true: mnist_y})# 写入每一步训练的值summary = sess.run(merged, feed_dict={x: mnist_x, y_true: mnist_y})filewriter.add_summary(summary, i)print("训练第%d步,准确率为%f" % (i, sess.run(accuracy, feed_dict={x: mnist_x, y_true: mnist_y})))# 保存模型saver.save(sess, "./tmp/ckpt/fe_model.ckpt")else:# 加载模型saver.restore(sess, "./tmp/ckpt/fe_model.ckpt")# 如果是0,做出预测for i in range(100):# 每次测试一张图片 [0,0,0,0,0,1,0,0,0,0]x_test, y_test = mnist.test.next_batch(1)print("第%d张图片,手写数字图片目标是:%d, 预测结果是:%d" % (i,tf.argmax(y_test, 1).eval(),tf.argmax(sess.run(y_predict, feed_dict={x: x_test, y_true: y_test}), 1).eval()))return Noneif __name__ == "__main__":full_connect()

先运行程序进行训练,小编这里采用if判断是进行训练还是测试。

训练完之后,输入 python xxx.py --is_train=0,进行测试

单层神经网络实现手写数字识别相关推荐

  1. 我的Go+语言初体验——Go+语言构建神经网络实战手写数字识别

    "我的Go+语言初体验" | 征文活动进行中- 我的Go+语言初体验--Go+语言构建神经网络实战手写数字识别 0. 前言 1. 神经网络相关概念 2. 构建神经网络实战手写数字识 ...

  2. 读书笔记-深度学习入门之pytorch-第四章(含卷积神经网络实现手写数字识别)(详解)

    1.卷积神经网络在图片识别上的应用 (1)局部性:对一张照片而言,需要检测图片中的局部特征来决定图片的类别 (2)相同性:可以用同样的模式去检测不同照片的相同特征,只不过这些特征处于图片中不同的位置, ...

  3. 深度学习 卷积神经网络-Pytorch手写数字识别

    深度学习 卷积神经网络-Pytorch手写数字识别 一.前言 二.代码实现 2.1 引入依赖库 2.2 加载数据 2.3 数据分割 2.4 构造数据 2.5 迭代训练 三.测试数据 四.参考资料 一. ...

  4. MATLAB实现基于BP神经网络的手写数字识别+GUI界面+mnist数据集测试

    文章目录 MATLAB实现基于BP神经网络的手写数字识别+GUI界面+mnist数据集测试 一.题目要求 二.完整的目录结构说明 三.Mnist数据集及数据格式转换 四.BP神经网络相关知识 4.1 ...

  5. 基于卷积神经网络的手写数字识别(附数据集+完整代码+操作说明)

    基于卷积神经网络的手写数字识别(附数据集+完整代码+操作说明) 配置环境 1.前言 2.问题描述 3.解决方案 4.实现步骤 4.1数据集选择 4.2构建网络 4.3训练网络 4.4测试网络 4.5图 ...

  6. 神经网络实现手写数字识别(MNIST)

    一.缘起 原本想沿着 传统递归算法实现迷宫游戏 --> 遗传算法实现迷宫游戏 --> 神经网络实现迷宫游戏的思路,在本篇当中也写如何使用神经网络实现迷宫的,但是研究了一下, 感觉有些麻烦不 ...

  7. 深度学习笔记:07神经网络之手写数字识别的经典实现

    神经网络之手写数字识别的经典实现 上一节完成了简单神经网络代码的实现,下面我们将进行最终的实现:输入一张手写图片后,网络输出该图片对应的数字.由于网络需要用0-9一共十个数字中挑选出一个,所以我们的网 ...

  8. 基于matlab BP神经网络的手写数字识别

    摘要 本文实现了基于MATLAB关于神经网络的手写数字识别算法的设计过程,采用神经网络中反向传播神经网络(即BP神经网络)对手写数字的识别,由MATLAB对图片进行读入.灰度化以及二值化等处理,通过神 ...

  9. 基于BP神经网络的手写数字识别

    基于BP神经网络的手写数字识别 摘要 本文实现了基于MATLAB关于神经网络的手写数字识别算法的设计过程,采用神经网络中反向传播神经网络(即BP神经网络)对手写数字的识别,由MATLAB对图片进行读入 ...

最新文章

  1. oracle 和 ' 特殊字符处理
  2. SAP FICO AS03显示固定资产主数据
  3. ubuntu再次体验之【美化】--修改主题、字体、字体大小
  4. 使用CSDN的Markdown编辑器
  5. 如何使Putty会话颜色更美观
  6. 对现有的所能找到的DDOS代码(攻击模块)做出一次分析----SYN(洪水攻击)篇
  7. owncloud nginx php,nginx配置owncloud记录。
  8. MySQL INSERT的4种形态
  9. Git学习笔记与IntelliJ IDEA整合
  10. mysql排插问题_手把手教你分析 MySQL 死锁问题
  11. Telnet服务安装及配置
  12. mysql_safe作用_mysqld_safe
  13. JAVA计算机毕业设计电商后台管理系统Mybatis+系统+数据库+调试部署
  14. 计算机网络中如何看别人的共享文件夹,教大家如何使用网络共享文件夹和手机如何使用电脑端查看网络共享-共享文件夹...
  15. 安卓4G/5G无线图传终端(单兵执法记录仪、智能安全帽、头盔摄像头)常见问题
  16. 【精英会会长、TOS顾问黄智中:区块链将改变价值传递方式】GBCAX
  17. 【数据库】数据库设计一
  18. P - Consumer
  19. android应用推广高招齐分享!力荐六大安卓应用推广方式
  20. Concept:USB OTG

热门文章

  1. C# 程序集(Assembly)
  2. 如何做快手副业?怎么在快手上赚工资?快手发视频怎么赚钱?
  3. 任天堂Switch玩舞力全开unlimited曲目卡顿问题解决思路
  4. SAP 移动价(V)与标准价(S)
  5. linux下ms安装教程,MS在linux的安装过程.doc
  6. Java批量下载并打成压缩包zip格式
  7. hadoop搭建伪分布式集群(centos7+hadoop-3.1.1)
  8. UEFI----EFI_DRIVER_BINDING_PROTOCOL
  9. 300最不常用的springboot计算机毕业设计题目汇总,总有你需要用到的
  10. 删除项目的SVN信息 取消项目的SVN关联 简单粗暴