前言:这是一篇基于tensorflow框架,创建的只有一层隐藏层的BP神经网络,做的图片识别,内容也比较简单,全当是自己的学习笔记了。

-----------------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------------------

1、加载MNIST数据集

from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('MNIST_data', one_hot=True)

mnist是一个轻量级的类。它以Numpy数组的形式存储着训练、校验和测试数据集,也是Google做图片识别的经典数据集。MNIST数据集下载链接: https://pan.baidu.com/s/1d9ty82 密码: jcam

2、运行TensorFlow框架

import tensorflow as tfsess = tf.InteractiveSession()
init = tf.global_variables_initializer()
sess.run(init)

TensorFlow框架与后端的连接叫做session,也就是说我们用session启动TensorFlow框架(详情就要自己深入了解了)

3、预定义输入值X,真实值Y

X = tf.placeholder(tf.float32, shape=[None, 784])
Y = tf.placeholder(tf.float32, shape=[None, 10])
  • X,Y现由占位符表示,可以在TensorFlow运行某一计算时,根据该占位符输入的具体的值而进行计算;
  • tf.float32 是存储的类型;shape=[None, 784]是数据维度大小——因为MNIST数据集中每一张图片大小都是2828的,计算时候是将2828的二维数据转换成一个一维的、长度为784的新向量。None表示其值大小不定,意即选中的X、Y的数量暂时不定

4、创建BP神经网络

"""
用随机数列生成的方式,创建含一个隐藏层的神经网络。(784,300,10)
"""
#truncated_normal:选取位于正态分布均值=0.1附近的随机值
w1 = tf.Variable(tf.truncated_normal([784,300],stddev=0.1))
w2 = tf.Variable(tf.zeros([300,10]))
b1 = tf.Variable(tf.zeros([300]))
b2 = tf.Variable(tf.zeros([10]))
#relu、softmax都为激活函数
L1 = tf.nn.relu(tf.matmul(X,w1)+b1)
y = tf.nn.softmax(tf.matmul(L1,w2)+b2)

BP神经网络输入层有784个神经元、隐藏层300个神经元、输出层10个神经元。初始化各级权重w1、w2;各级偏置值b1、b2——都是采用随机数列生成的方式。定义隐藏层、输出层的计算方式以及各自的激活函数。

5、计算误差并用梯度下降法优化权重

#二次代价函数:计算预测值y与真实值Y之间的误差
loss = tf.reduce_mean(tf.square(Y - y))
#梯度下降法:选用GradientDescentOptimizer优化器,学习率为0.5
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(loss)

误差也叫损失函数、代价函数。TensorFlow中有大量内置的优化算法,这里我们选用最简单的GradientDescentOptimizer优化器让交叉熵下降,步长为定为0.5

6、计算准确率

#结果存放在一个布尔型列表中
correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(Y,1))
#求准确率
accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
  • tf.argmax()函数:是返回对象在某一维上的其数据最大值所对应的索引值,由于这里的标签向量都是由0,1组成,因此最大值1所在的索引位置就是对应的类别标签
  • tf.argmax(y,1)返回的是对于任一输入x预测到的标签值,tf.argmax(Y,1)代表正确的标签值
  • correct_prediction 这里是返回一个布尔数组。为了计算我们分类的准确率,我们将布尔值转换为浮点数来代表对与错,然后取平均值。例如:[True, False, True, True]变为[1,0,1,1],计算出准确率就为0.75

7、其他说明

batch_xs,batch_ys = mnist.train.next_batch(batch_size)sess.run(train_step,feed_dict=({X:batch_xs,Y:batch_ys}))acc = sess.run(accuracy,feed_dict={X:mnist.test.images,Y:mnist.test.labels})
  • batch_xs与batch_ys:是从MNIST数据集中按批次数取得的:数据项与标签项
  • feed_dict=({X:batch_xs,Y:batch_ys}语句:是将batch_xs、batch_ys代表的值传入X、Y

源码与效果展示

# -*- coding:utf-8 -*-
# -*- author:zzZ_CMing
# -*- 2018/01/23;21:49
# -*- python3.5import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'#读取MNIST数据集
mnist = input_data.read_data_sets("MNIST_data",one_hot=True)
#设置每个批次的大小
batch_size = 500
#计算一共有多少个批次(地板除)
n_batch = mnist.train.num_examples//batch_size
#预定义输入值X、输出真实值Y    placeholder为占位符
X = tf.placeholder(tf.float32,[None,784])
Y = tf.placeholder(tf.float32,[None,10])"""
用随机数列生成的方式,创建含一个隐藏层的神经网络。(784,300,10)
"""
#truncated_normal:选取位于正态分布均值=0.1附近的随机值
w1 = tf.Variable(tf.truncated_normal([784,300],stddev=0.1))
w2 = tf.Variable(tf.zeros([300,10]))
b1 = tf.Variable(tf.zeros([300]))
b2 = tf.Variable(tf.zeros([10]))
#relu、softmax都为激活函数
L1 = tf.nn.relu(tf.matmul(X,w1)+b1)
y = tf.nn.softmax(tf.matmul(L1,w2)+b2)
#二次代价函数:预测值与真实值的误差
loss = tf.reduce_mean(tf.square(Y - y))
#梯度下降法:选用GradientDescentOptimizer优化器,学习率为0.5
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(loss)
#结果存放在一个布尔型列表中
correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(Y,1))
#求准确率
accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32))#初始化变量,激活tf框架
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)for i in range(21):for batch in range(n_batch):batch_xs,batch_ys = mnist.train.next_batch(batch_size)sess.run(train_step,feed_dict=({X:batch_xs,Y:batch_ys}))acc = sess.run(accuracy,feed_dict={X:mnist.test.images,Y:mnist.test.labels})print("Iter " + str(i)+",Testing Accuracy "+str(acc))

效果展示:

  • 迭代10次的准确率就已经到90.85%,对于现在的技术来说,这个准确率还是比较低的。CNN卷积神经网络对于更为复杂的图片识别准确率都已经能达到98%以上,所以自己的学习之路还得百尺竿头更进一步
  • 程序运行起来比较慢,大家全当学习了

-----------------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------------------

系列推荐:

【监督学习】1:KNN算法实现手写数字识别的三种方法
-----------------------------------------------------------------------------------------------------------------------------------------
【无监督学习】1:K-means算法原理介绍,以及代码实现
【无监督学习】2:DBSCAN算法原理介绍,以及代码实现
【无监督学习】3:Density Peaks聚类算法(局部密度聚类)
-----------------------------------------------------------------------------------------------------------------------------------------
【深度学习】1:感知器原理,以及多层感知器解决异或问题
【深度学习】2:BP神经网络的原理,以及异或问题的解决
【深度学习】3:BP神经网络识别MNIST数据集
【深度学习】4:BP神经网络+sklearn实现数字识别
【深度学习】5:CNN卷积神经网络原理、MNIST数据集识别
【深度学习】8:CNN卷积神经网络识别sklearn数据集(附源码)
【深度学习】6:RNN递归神经网络原理、MNIST数据集识别
【深度学习】7:Hopfield神经网络(DHNN)原理介绍
-----------------------------------------------------------------------------------------------------------------------------------------
TensorFlow框架简单介绍
-----------------------------------------------------------------------------------------------------------------------------------------

【深度学习】3:BP神经网络与MNIST数据集实现手写数字识别相关推荐

  1. 神经网络——实现MNIST数据集的手写数字识别

    由于官网下载手写数字的数据集较慢,因此提供便捷下载地址如下 手写数字的数据集MNIST下载:https://download.csdn.net/download/gaoyu1253401563/108 ...

  2. 深度学习(32)随机梯度下降十: 手写数字识别问题(层)

    深度学习(32)随机梯度下降十: 手写数字识别问题(层) 1. 数据集 2. 网络层 3. 网络模型 4. 网络训练 本节将利用前面介绍的多层全连接网络的梯度推导结果,直接利用Python循环计算每一 ...

  3. 深度学习 LSTM长短期记忆网络原理与Pytorch手写数字识别

    深度学习 LSTM长短期记忆网络原理与Pytorch手写数字识别 一.前言 二.网络结构 三.可解释性 四.记忆主线 五.遗忘门 六.输入门 七.输出门 八.手写数字识别实战 8.1 引入依赖库 8. ...

  4. DL之CNN:自定义SimpleConvNet【3层,im2col优化】利用mnist数据集实现手写数字识别多分类训练来评估模型

    DL之CNN:自定义SimpleConvNet[3层,im2col优化]利用mnist数据集实现手写数字识别多分类训练来评估模型 目录 输出结果 设计思路 核心代码 更多输出 输出结果 设计思路 核心 ...

  5. 基于TensorFlow和mnist数据集的手写数字识别系统 ,可识别电话号码,识别准确率高,有对比实验,两组模型,可讲解代码

    基于TensorFlow和mnist数据集的手写数字识别系统 ,可识别电话号码,识别准确率高,有对比实验,两组模型,可讲解代码

  6. pytorch 预测手写体数字_深度学习之PyTorch实战(3)——实战手写数字识别

    如果需要小编其他论文翻译,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/DeepLearningNote 上一节,我们已经 ...

  7. 深度学习基础: BP神经网络训练MNIST数据集

    BP 神经网络训练MNIST数据集 不用任何深度学习框架,一起写一个神经网络训练MNIST数据集 本文试图让您通过手写一个简单的demo来讨论 1. 导包 import numpy as np imp ...

  8. MNIST数据集实现手写数字识别(基于tensorflow)

    ------------先看看别人的博客--------------------- Tensorflow 实现 MNIST 手写数字识别         用这个的代码跑通了 使用Tensorflow和 ...

  9. 【深度学习】实验1答案:Softmax实现手写数字识别

    DL_class 学堂在线<深度学习>实验课代码+报告(其中实验1和实验6有配套PPT),授课老师为胡晓林老师.课程链接:https://www.xuetangx.com/training ...

  10. matlab朴素贝叶斯手写数字识别_基于MNIST数据集实现手写数字识别

    介绍 在TensorFlow的官方入门课程中,多次用到mnist数据集.mnist数据集是一个数字手写体图片库,但它的存储格式并非常见的图片格式,所有的图片都集中保存在四个扩展名为idx*-ubyte ...

最新文章

  1. vue学习笔记(二)- 数据绑定、列表渲染、条件判断
  2. iOS c语言 基本运算符
  3. 【ArcGIS遇上Python】ArcGIS Python批处理入门到精通实用教程目录
  4. 《MapReduce 2.0源码分析与编程实战》一第2章 入门
  5. 【linux指令】dialog实现终端下的GUI-3
  6. n160ii打印机查看ip地址_喷墨打印机自动清洁打印头方法你知道几个?
  7. mysql 矩表_mysql表某相同值最近一次出现的间距
  8. Linux进程管理工具
  9. C++赋值运算符重载函数(operator=)
  10. 基于全网最棒的Vue教学视频(尚硅谷张天禹老师)整理出的最详细的Vue指令笔记
  11. win10专业版 命令行窗口运行“wsdl2java”命令,提示系统找不到指定路径
  12. 原生JS与其他JS 区别
  13. B站视频下载(含bv快速变回av)
  14. 基于python的税额计算器
  15. 科大讯飞语音转写以及语音合成配置+遇到问题处理
  16. Whois 查询违法?
  17. java实现简单的文件下载
  18. Fama-French三因子模型
  19. Stimulsoft Reports.WEB 23.1.8 完美Crack
  20. SQL Dblink SQL

热门文章

  1. Syzmlw 蜗居大结局
  2. 计算机应用选购哪些电脑,购买电脑有哪些要注意的
  3. Chrome浏览器浅析
  4. 哇塞!这是我见过的最牛逼的性能监控系统,集强大功能于一身~
  5. 华硕服务器 u盘安装系统,华硕电脑u盘安装系统教程
  6. Dominant Resource Fairness: Fair Allocation of Multiple Resource Types
  7. python 笔记之“海龟”画图 演示画小猪佩奇,机器猫
  8. 【ps功能精通】6.钢笔工具
  9. 在北京租房 舒舍的租客素质怎么样?
  10. mysql analyze_技术分享 | MySQL EXPLAIN ANALYZE