神经网络学习(二)神经网络-手写字体识别

框架:Tensorflow 1.10.0
数据集:mnist数据集
策略:交叉熵损失
优化:梯度下降
五个模块:拿数据、搭网络、求损失、优化损失、算准确率

一、拿数据

1、下载数据集

下载数据集点这里:mnist数据集官网下载。将下图四项下载下来。放入接下来代码所在的文件夹。

2、导入数据

把tensorflow和input_data给导进来,tensorflow就不作解释了,input_data是用来操作mnist数据集的。代码如下。( ps:全部代码在最下面,不要着急,先按照下面的思路走完,然后再看代码也不迟。代码里也加了注释。静心往下看。)

from tensorflow.examples.tutorials.mnist import input_data
import tensorflow as tf

将上面下载的四项数据文件的路径写进去代码如下,目标值使用独热编码(one_hot)

mnist = input_data.read_data_sets("./data/mnist/input_data/", one_hot=True)

3、数据集简介

手写数字的MNIST数据库有一个包含60,000个示例的训练集和一个包含10,000个示例的测试集。它是NIST中更大集合的子集。在固定大小的图像中,数字已被大小归一化并居中。
里面都是手写的数字(从0到9)的图片。

二、搭建网络

1、建立占位符

tf.variable_scope可以认为是一个空间或者是op管理器,在此范围内创建的变量都属于这个空间,注意:不可创建相同名称的变量。其中xy_true 作用是占座位或是分割数据,是为训练样本跟其对应的特征值(样本所所属的类别)准备的。784是如何来的呢?mnist数据集中包含很多图片,图片 长*宽=28×28=784,即像素为784。上面提到 mnist数据集里面包含6000个示例,其中一个示例就是一张照片, 一张照片就是28×28=784,那就可以把mnist数据集看做是一个6000×784的矩阵。 None(矩阵的行)在这的表示为任意值或不确定值,因为这关系到我们每一次训练模型时所用到的样本大小(batch)

  with tf.variable_scope("data"):  x = tf.placeholder(tf.float32, [None, 784]) y_true = tf.placeholder(tf.int32, [None, 10])

2、搭建全连接层神经网络

简单的来说就是wx+b:w为权重,b为偏置。

神经网络训练的过程 其实就是通过对比预测值(y_predict)与目标值(y_true)间的差异来不断优化w跟b的一个过程。那么下面第一步就是初始化w跟b。

其中tf.random_normal([784, 10]两个变量784跟10,784为特征点(一张图片的784个像素点或一张图片的784个特征)数量,10为其目标值(0-9)的数量。
y_predict即为一次预测所得到的结果。

   with tf.variable_scope("fc_model"):# 随即初始化权重和偏置weight = tf.Variable(tf.random_normal([784, 10], dtype=float, name="w"))bias = tf.Variable(tf.constant(0.0, shape=[10]))y_predict = tf.matmul(x, weight) + bias  # tf.matmul是矩阵乘法

三、计算损失(loss)

求平均交叉熵损失(先经过softmax得到概率,后交叉熵拿损失,后求平均损失)
什么是损失,损失就是我们的预测值跟其对应的目标值(其真实值)之间的差异。
这里我们用到了交叉熵损失函数数学公式如下:
在求损失之前我们先计算预测值的概率,这里用到的是softmax函数,数学公式看不明白没事 tensorflow一行代码就解决,tf.nn.softmax_cross_entropy_with_logits(这一行代码就把softmax跟交叉熵损失函数包括了)

 with tf.variable_scope("soft_cross"):loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_true, logits=y_predict))


四、梯度下降减小损失

0.1是学习率 不要太大了,再将损失传进去。个人认为这个过程才是真正的训练过程。

    with tf.variable_scope("optimizer"):train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)

五、计算准确率

 with tf.variable_scope("acc"):# 分别拿到预测样本跟目标样本每一行的最大下标 ,若下表相等 返回1 不相等返回0equal_list = tf.equal(tf.argmax(y_true, 1), tf.argmax(y_predict, 1))accuracy = tf.reduce_mean(tf.cast(equal_list, tf.float32))

六、效果

1、用了测试集的100张照片进行测试,准确率为85%。

七、代码

from tensorflow.examples.tutorials.mnist import input_data
import tensorflow as tfFlAGS = tf.flags.FLAGS
tf.flags.DEFINE_integer("is_train", 0, "指定程序是预测还是训练")# 单层(全连接阶层)
def full_connected():# 获取数据mnist = input_data.read_data_sets("./data/mnist/input_data/", one_hot=True)#  1、建立数据占位符  x [None,784]  y_true[None,10]with tf.variable_scope("data"):  # tf.variable_scope算是个命名空间或者是op管理器,在此范围内创建的变量都属于这个空间,注意:不可创建相同名称的变量。x = tf.placeholder(tf.float32, [None, 784])  # 占位符,【none,784】表示任意行,取784列y_true = tf.placeholder(tf.int32, [None, 10])#  2、建立一个全连接层的神经网络 w = [784,10]  b = [10]with tf.variable_scope("fc_model"):# 随即初始化权重和偏置weight = tf.Variable(tf.random_normal([784, 10], dtype=float, name="w"))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  # tf.matmul矩阵乘法# 3、求所有样本的损失、然后求平均值with tf.variable_scope("soft_cross"):# 求平均交叉熵损失(先经过softmax得到概率,后交叉熵拿损失,后求平均损失)loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_true, logits=y_predict))# 4、梯度下降求出损失with tf.variable_scope("optimizer"):train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)# 5、计算准确率with tf.variable_scope("acc"):# 分别拿到预测样本跟目标样本每一行的最大下标 ,若下表相等 返回1 不相等返回0equal_list = tf.equal(tf.argmax(y_true, 1), tf.argmax(y_predict, 1))# 准确率=算平均值 None个样本 [1,0,1,0,1,1,0,1,..............................]accuracy = tf.reduce_mean(tf.cast(equal_list, tf.float32))# 收集变量  (一维)单个数字值收集tf.summary.scalar("losses", loss)tf.summary.scalar("acc", accuracy)# 收集变量 高纬度变量收集tf.summary.histogram("weightes", weight)tf.summary.histogram("biases", bias)# 定义一个合并变量的操作operationmerged = tf.summary.merge_all()# 定一个初始化变量的opinit_op = tf.global_variables_initializer()# 定义一个saver用于保存模型saver = tf.train.Saver()correct = 0# 6、开启会话去训练with tf.Session() as sess:# 初始化变量sess.run(init_op)# 建立events文件,然后写入filewriter = tf.summary.FileWriter("./temp/summary/test/", graph=sess.graph)# 设置一个标志位用于判断是进行训练 还是进行测试机预测# 如果是1 则训练,0则预测if FlAGS.is_train == 1:# 迭代步数去训练,更新参数 预测for i in range(2000):# 取出真实存在的目标值和特征值mnist_x, mnist_y = mnist.train.next_batch(50)# 运行train_op训练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, "./temp/ckpt/fc_model")else:saver.restore(sess, "./temp/ckpt/fc_model")# 如果是0,则作出预测for i in range(100):# 每次测试一张图片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()))if (tf.argmax(y_test, 1).eval() == tf.argmax(sess.run(y_predict, feed_dict={x: x_test, y_true: y_test}),1).eval()):correct += 1print("100样本预测准确率:%f" % (correct/100))return Noneif __name__ == "__main__":full_connected()

神经网络学习(二)Tensorflow-简单神经网络(全连接层神经网络)实现手写字体识别相关推荐

  1. 《深度学习之TensorFlow》reading notes(3)—— MNIST手写数字识别之二

    文章目录 模型保存 模型读取 测试模型 搭建测试模型 使用模型 模型可视化 本文是在上一篇文章 <深度学习之TensorFlow>reading notes(2)-- MNIST手写数字识 ...

  2. 神经网络学习(三)比较详细 卷积神经网络原理、手写字体识别(卷积网络实现)

    之前写了一篇基于minist数据集(手写数字0-9)的全连接层神经网络,识别率(85%)并不高,这段时间学习了一些卷积神经网络的知识又实践了一把, 识别率(96%左右)确实上来了 ,下面把我的学习过程 ...

  3. 神经网络实现手写字体识别

    神经网络入门学习中,进行了手写字体识别实践,该篇博客用于记录实践代码,以备后续使用. 关键词:神经网络,前向传播.反向传播.梯度下降.权值更新.手写字体识别 1. 实践代码 import numpy ...

  4. 《MATLAB 神经网络43个案例分析》:第19章 基于SVM的手写字体识别

    <MATLAB 神经网络43个案例分析>:第19章 基于SVM的手写字体识别 1. 前言 2. MATLAB 仿真示例 3. 小结 1. 前言 <MATLAB 神经网络43个案例分析 ...

  5. 基于Python神经网络的手写字体识别

    本文将分享实现手写字体识别的神经网络实现,代码中有详细注释以及我自己的一些体会,希望能帮助到大家 (≧∇≦)/ ############################################ ...

  6. python手写字体程序_深度学习---手写字体识别程序分析(python)

    我想大部分程序员的第一个程序应该都是"hello world",在深度学习领域,这个"hello world"程序就是手写字体识别程序. 这次我们详细的分析下手 ...

  7. 深度学习,实现手写字体识别(大数据人工智能公司)

    手写字体识别是指给定一系列的手写字体图片以及对应的标签,构建模型进行学习,目标是对于一张新的手写字体图片能够自动识别出对应的文字或数字.通过深度学习构建普通神经网络和卷积神经网络,处理手写字体数据.通 ...

  8. TensorFlow 高级之二 (卷积神经网络手写字体识别)

    文章目录 一.数据集获取 二.数据感知与处理 2.1 导包 2.2 导入数据 2.3 把标签转换为one-hot格式 2.4. 数据维度 2.5. 打印部分样例图片 三.创建神经网络 3.1 定义网络 ...

  9. (二)Tensorflow搭建卷积神经网络实现MNIST手写字体识别及预测

    1 搭建卷积神经网络 1.0 网络结构 图1.0 卷积网络结构 1.2 网络分析 序号 网络层 描述 1 卷积层 一张原始图像(28, 28, 1),batch=1,经过卷积处理,得到图像特征(28, ...

最新文章

  1. C++知识点29——使用C++标准库(迭代器适配器)
  2. WINDOWS 逻辑坐标 设备坐标 屏幕坐标 客户区坐标
  3. boost::phoenix::if_相关的测试程序
  4. PMP每日三题(2022年3月8日)
  5. 左神算法:用一个栈实现另一个栈的排序(Java版)
  6. swift5导航栏标题文字属性设置
  7. SVG 和 CSS3 实现一个超酷爱心 Like 按钮
  8. 下载腾讯视频里的视频_手机腾讯视频如何升级新版本
  9. 【ICPC 2021网络赛2】The 2021 ICPC Asia Regionals Online Contest (II)签到题5题
  10. 【c语言大作业】c语言编写贪吃蛇
  11. Css实现雷达扫描动画效果
  12. 什么是域名备案?为什么要进行备案?备案后你将会获得下列益处
  13. process-on在线绘制架构图,xmind绘制思维导图
  14. 推荐语、学生和网友留言——《逆袭大学》连载
  15. Bootstrap进阶四:jQuery插件详解
  16. 什么是EMO?我emo了是什么意思?
  17. 淘宝婴儿产品销售的数据分析
  18. JSONObject转换json时出现nameValuePair
  19. 网狐棋牌 二次开发流程
  20. 6种最流行的项目管理方法

热门文章

  1. Filter的使用场景:敏感词过滤
  2. [海思]--Hi3516a--添加新Sensor
  3. 2023年第二十届五一数学建模竞赛题目 C题详细思路
  4. 虚拟光驱(virtual drive) v7.12 个人版 绿色
  5. HC-SR04 超声波测距模块 IIC使用代码
  6. 使用BigInteger.setBit与BigInteger.testBit来实现权限控制
  7. java数据结构家族族谱_java数据结构41:家谱处理
  8. Android 实现PDF预览的全面解析
  9. 热评云厂商:软通动力7.93亿元,加速云业务创新升级
  10. 实践与共享:一键永久激活 Windows Server 2008 和 Windows Server 2008 R2 的MAK密钥