MNIST手写体数字识别是神经网络的一个经典的入门案例,堪称深度学习界的”Hello Word任务”。

本博客基于python语言,在TensorFlow框架上对其进行了复现,并作了详细的注释,希望有参考作用。

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets("D:\ClassStudy\ImageProcessing\MNIST_DATA", one_hot=True) batch_size = 100 #batch大小为100,训练样本为55000,那么总共有5500个batch
learning_rate = 0.8
learning_rate_decay = 0.999
max_steps = 30000 #最大训练步数 training_step = tf.Variable(0,trainable=False) #定义存储训练轮数的变量,一般将其设置为不可训练的,完成一个batch即完成一轮训练 def hidden_layer(input_tensor,weights1,biases1,weights2,biases2,layer_name):
'''
定义得到隐藏层和输出层的前向传播计算方式,采用relu()激活函数
'''
layer1=tf.nn.relu(tf.matmul(input_tensor,weights1)+biases1)
return tf.matmul(layer1,weights2)+biases2 x = tf.placeholder(tf.float32,[None,784],name='x-input')
y_ = tf.placeholder(tf.float32,[None,10],name='y-output') #生成隐藏层权重参数,生成的是784*500的数组,总共392000个参数,500是经验值,实际多少都可以
weights1 = tf.Variable(tf.truncated_normal([784,500],stddev=0.1))
biases1 = tf.Variable(tf.constant(0.1,shape=[500])) #生成输出层权重参数,生成的是500*10的数组,总共5000个参数,这里的500为了跟隐藏层的输出矩阵列数500对应,10是要求输出必须为10列,因为总共0-9就是10个分类
weights2 = tf.Variable(tf.truncated_normal([500,10],stddev=0.1))
biases2 = tf.Variable(tf.constant(0.1,shape=[10])) #计算经过神经网络前向传播后得到的y值,这个y是一个10列的矩阵
y = hidden_layer(x,weights1,biases1,weights2,biases2,'y') '''
为了在采用随机梯度下降算法训练神经网络时提高最终模型在测试数据上的表现,TensorFlow提供了一种在变量上使用滑动平均的方法,通常称之为滑动平均模型
'''
#通过train.ExponentialMovingAverage()函数初始化一个滑动平均类,同时需要向函数提供一个衰减率参数,这个衰减率控制模型更新的速度。
#滑动平均算法会对每一个变量的影子变量(shadow_variable)进行维护,这个影子变量的初始值就是相应变量的初始值。如果变量发生变化,影子变量也会按照一定的规则更新。
#衰减率决定了滑动平均模型的更新速度,一般设成接近于1,且越大模型越趋于稳。
averages_class = tf.train.ExponentialMovingAverage(0.99,training_step)
#通过滑动平均类的apply函数提供要进行滑动平均计算的变量
averages_op = averages_class.apply(tf.trainable_variables())
#average()函数是滑动平均类的一个函数,这个函数真正执行了影子变量的计算。在使用时,对其传入需要进行计算的变量即可。
#这里再次计算y值,使用了滑动平均,但是要牢记滑动平均值只是一个影子变量。
average_y = hidden_layer(x,averages_class.average(weights1),
averages_class.average(biases1),
averages_class.average(weights2),
averages_class.average(biases2),'average_y') #计算交叉熵损失,用到的这个函数适用于输入的样本只能被划分为某一类的情况,特别适合于我们这个任务。
cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y,labels=tf.argmax(y_,1)) #在得到交叉熵之后,我们可以计算权重的L2正则,并将正则损失和交叉熵损失糅合在一起计算总损失
regularizer = tf.contrib.layers.l2_regularizer(0.0001)
regularization = regularizer(weights1)+regularizer(weights2)
#总损失
loss = tf.reduce_mean(cross_entropy)+regularization #总损失确定好了,还需要一个优化器。这里采用原理最简单的随机梯度下降优化器,学习率采用指数衰减的形式,优化器类的minimize()函数指明了最小化的目标。
learning_rate = tf.train.exponential_decay(learning_rate,training_step,mnist.train.num_examples/batch_size,learning_rate_decay)
train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss,global_step=training_step) #在训练这个模型时,每过一遍数据既需要通过反向传播来更新神经网络中的参数,又需要更新每一个参数的滑动平均值,control_dependencies()用于完成这样的一次性多次操作
with tf.control_dependencies([train_step,averages_op]):
train_op = tf.no_op(name='train') #检查使用了滑动平均值模型的神经网络前向传播结果是否正确
#equal()函数用于判断两个张量的每一位数组是否相等
#如果相等则返回true,否则返回false
crorent_predicition = tf.equal(tf.arg_max(average_y,1),tf.arg_max(y_,1)) #cast()函数原型为cast(x, DstT, name),在这里用于将一个布尔型的数据转换为float32类型
#之后对得到的float32类型数据求平均值,这个平均值就是模型在这一组数据上的正确率
accuracy = tf.reduce_mean(tf.cast(crorent_predicition,tf.float32)) '''
以上都完成之后,就可以创建会话并开始训练了
'''
with tf.Session() as sess:
#对参数进行初始化
tf.global_variables_initializer().run()
#准备验证数据
validate_feed = {x:mnist.validation.images,y_:mnist.validation.labels}
#准备测试数据
test_feed = {x:mnist.test.images,y_:mnist.test.labels}
#循环训练,最大训练步数(轮数),训练一个batch为一轮
for i in range(max_steps):
if i % 1000 == 0:
#计算滑动平均模型在验证数据上的结果
#为了能得到百分数输出,需要将validate_accuracy扩大100倍
validate_accuracy = sess.run(accuracy, feed_dict=validate_feed)
print('After %d training step(s), validation accuracy'
'using average model is %g%%' % (i,validate_accuracy*100))
#train.next_batch()函数通过设置函数的batch_size参数就可以从所有的训练数据中读取一小部分作为一个训练的batch
xs,ys = mnist.train.next_batch(batch_size=100)
sess.run(train_op,feed_dict={x:xs,y_:ys})
#使用测试数据集最终验证正确率,同样为了得到得到百分数输出,需要扩大100倍
test_accuracy = sess.run(accuracy,feed_dict=test_feed)
print('After %d training step(s), test accuracy using average'
'model is %g%%' % (max_steps,test_accuracy*100))

  输出结果:

After 0 training step(s), validation accuracyusing average model is 7.4%
After 1000 training step(s), validation accuracyusing average model is 97.82%
After 2000 training step(s), validation accuracyusing average model is 98.1%
After 3000 training step(s), validation accuracyusing average model is 98.36%
After 4000 training step(s), validation accuracyusing average model is 98.38%
After 5000 training step(s), validation accuracyusing average model is 98.48%
After 6000 training step(s), validation accuracyusing average model is 98.36%
After 7000 training step(s), validation accuracyusing average model is 98.5%
After 8000 training step(s), validation accuracyusing average model is 98.4%
After 9000 training step(s), validation accuracyusing average model is 98.52%
After 10000 training step(s), validation accuracyusing average model is 98.5%
After 11000 training step(s), validation accuracyusing average model is 98.6%
After 12000 training step(s), validation accuracyusing average model is 98.48%
After 13000 training step(s), validation accuracyusing average model is 98.56%
After 14000 training step(s), validation accuracyusing average model is 98.54%
After 15000 training step(s), validation accuracyusing average model is 98.6%
After 16000 training step(s), validation accuracyusing average model is 98.6%
After 17000 training step(s), validation accuracyusing average model is 98.62%
After 18000 training step(s), validation accuracyusing average model is 98.56%
After 19000 training step(s), validation accuracyusing average model is 98.66%
After 20000 training step(s), validation accuracyusing average model is 98.6%
After 21000 training step(s), validation accuracyusing average model is 98.7%
After 22000 training step(s), validation accuracyusing average model is 98.6%
After 23000 training step(s), validation accuracyusing average model is 98.54%
After 24000 training step(s), validation accuracyusing average model is 98.6%
After 25000 training step(s), validation accuracyusing average model is 98.64%
After 26000 training step(s), validation accuracyusing average model is 98.64%
After 27000 training step(s), validation accuracyusing average model is 98.6%
After 28000 training step(s), validation accuracyusing average model is 98.56%
After 29000 training step(s), validation accuracyusing average model is 98.52%
After 30000 training step(s), test accuracy using averagemodel is 98.4%

  

MNIST-神经网络的经典实践的更多相关文章

  1. 深度学习——卷积神经网络 的经典网络(LeNet-5、AlexNet、ZFNet、VGG-16、GoogLeNet、ResNet)

    一.CNN卷积神经网络的经典网络综述 下面图片参照博客:http://blog.csdn.net/cyh_24/article/details/51440344 二.LeNet-5网络 输入尺寸:32 ...

  2. 第十三节,卷积神经网络之经典网络LeNet-5、AlexNet、VGG-16、ResNet(三)(后面附有一些网络英文翻译文章链接)

    一 实例探索 上一节我们介绍了卷积神经网络的基本构建,比如卷积层.池化层以及全连接层这些组件.事实上,过去几年计算机视觉研究中的大量研究都集中在如何把这些基本构件组合起来,形成有效的卷积神经网络.最直 ...

  3. MNIST神经网络的训练

    import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data 1.设置输入和输出节点的个数,配置 ...

  4. 深度学习方法(五):卷积神经网络CNN经典模型整理Lenet,Alexnet,Googlenet,VGG,Deep Residual Learning

    欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld. 技术交流QQ群:433250724,欢迎对算法.技术感兴趣的同学加入. 关于卷积神经网络CNN,网络和文献中 ...

  5. 数据挖掘系列(9)——BP神经网络算法与实践

    神经网络曾经很火,有过一段低迷期,现在因为深度学习的原因继续火起来了.神经网络有很多种:前向传输网络.反向传输网络.递归神经网络.卷积神经网络等.本文介绍基本的反向传输神经网络(Backpropaga ...

  6. Oracle调优总结(经典实践 重要)

    转载:http://langgufu.iteye.com/blog/1974211 Problem Description:1.每个表的结构及主键索引情况2.每个表的count(*)记录是多少3.对于 ...

  7. 神经网络JOONE的实践

    什么是joone Joone是一个免费的神经网络框架来创建,训练和测试人造神经网络.目标是为最热门的Java技术创造一个强大的环境,为热情和专业的用户. Joone由一个中央引擎组成,这是Joone开 ...

  8. 第十四节,卷积神经网络之经典网络Inception(四)

    一 1x1卷积 在架构内容设计方面,其中一个比较有帮助的想法是使用 1×1 卷积.也许你会好奇,1×1 的卷积能做什么呢?不就是乘以数字么?听上去挺好笑的,结果并非如此,我们来具体看看. 过滤器为 1 ...

  9. 卷积神经网络CNN经典模型整理Lenet,Alexnet,Googlenet,VGG,Deep Residual Learning(转)

    参考:http://blog.csdn.net/xbinworld/article/details/45619685

随机推荐

  1. 创建组件的方法,组件的props属性、state属性的用法和特点,父子组件传值,兄弟组件传值

    1.创建组件的方法   函数组件   class组件 1.1 函数组 无状态函数式组件形式上表现为一个只带有一个 `render()` 方法的组件类,通过函数形式或者 `ES6` 箭头 `functi ...

  2. Make Them Odd

    time limit per test3 secondsmemory limit per test256 megabytesinput: standard inputoutput: standard ...

  3. 使用adb安装apk到手机

    [ADB]Android debug bridge.Android手机实际是基于Linux系统的.通过USB线将android手机与电脑连起来,在电脑上dos命令行中敲adb shell命令,可以登录 ...

  4. 我用python训练了一个拳皇模型,从此在各地游戏厅再也没输过!

    ​ 从世界瞩目的围棋游戏 AlphaGo ​ ​ ​ 突然袭来的回忆杀~ 今天为大家介绍一个在街机游戏<街头霸王 3>中进行模拟来训练改进强化学习算法的工具包.不仅在 MAME 游戏模拟器 ...

  5. 不为人知的网络编程(九):理论联系实际,全方位深入理解DNS

    本文原作者:selfboot,博客地址:selfboot.cn,Github地址:github.com/selfboot,感谢原作者的技术分享. 1.引言 对于 DNS(Domain Name Sys ...

  6. C# Event在.Net规则下由接口定义的实现

    最近在学C#(教材<C# in a nutshell>很不错的说),看完delegate(委托)以后,紧接着就是event(事件)了,个人对跟.Net相关的东西并没有什么兴趣(毕竟是会增加 ...

  7. 【Linux命令】常用系统工作命令11个(echo、date、reboot、poweroff、wget、ps、top、pidof、kill、killall、pkill)

    目录 echo命令 date命令 reboot命令 poweroff命令 wget命令 ps命令 top命令 pidof命令 kill命令 killall命令 pkill命令 一.echo命令 ech ...

  8. MySQL变量介绍和用法简介

    目录 一.用户变量 1.1.用户变量定义 1.2.用户变量用法 二.系统变量 2.1 系统变量简单介绍 2.2 系统变量用法简介 本博客介绍一下MySQL中变量的用法和注意细节 @ 一.用户变量 1. ...

  9. swoole中http_server的配置与使用

    swoole中为我们提供了一个swoole_http_server类,方便我们处理http请求. 但是它对http协议的支持并不完整,所以一般建议在前面加一层nginx进行代理,对于php文件的处理交 ...

  10. 学习Swoole需要掌握哪些基础知识

    多进程/多线程 了解Linux操作系统进程和线程的概念 了解Linux进程/线程切换调度的基本知识 了解进程间通信的基本知识,如管道.UnixSocket.消息队列.共享内存 SOCKET 了解SOC ...