BP神经网络+TensorFlow做图片识别

Posted Python爱好者社区

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BP神经网络+TensorFlow做图片识别相关的知识,希望对你有一定的参考价值。

BP神经网络+TensorFlow做图片识别

博客:http://blog.csdn.net/zzz_cming


作者好文推荐:


前言:这是一篇基于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 tf sess = 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数据集中每一张图片大小都是28*28的,计算时候是将28*28的二维数据转换成一个一维的、长度为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、计算误差并用梯度下降法优化权重

#结果存放在一个布尔型列表中 correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(Y,1)) #求准确率 accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32))


误差也叫损失函数、代价函数。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.5 import 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))

效果展示: 


BP神经网络+TensorFlow做图片识别

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

  • 程序运行起来比较慢,大家全当学习了


推荐自己写的另一篇手写数字识别:


《人工智能1:KNN算法,实现手写数字识别(附源码)》
链接:
http://blog.csdn.net/zzz_cming/article/details/78938107


赞赏作者

BP神经网络+TensorFlow做图片识别

BP神经网络+TensorFlow做图片识别

Python爱好者社区历史文章大合集


小编的Python入门视频课程!!!

崔老师爬虫实战案例免费学习视频。

丘老师数据科学入门指导免费学习视频。

陈老师数据分析报告制作免费学习视频。

玩转大数据分析!Spark2.X+Python 精华实战课程免费学习视频。

丘老师Python网络爬虫实战免费学习视频。


以上是关于BP神经网络+TensorFlow做图片识别的主要内容,如果未能解决你的问题,请参考以下文章

基于 Tensorflow 2.x 实现多层卷积神经网络,实践 MNIST 手写数字识别

基于 Tensorflow 2.x 实现多层卷积神经网络,实践 MNIST 手写数字识别

基于 Tensorflow 2.x 实现 BP 神经网络,实践 MNIST 手写数字识别

基于 Tensorflow 2.x 实现 BP 神经网络,实践 MNIST 手写数字识别

基于 Tensorflow 2.x 实现 BP 神经网络,实践 MNIST 手写数字识别

BP神经网络-手写数字的识别-机器学习实验二