在我的上一篇随笔中,采用了单层神经网络来对MNIST进行训练,在测试集中只有约90%的正确率。这次换一种神经网络(多层神经网络)来进行训练和测试。

1、获取MNIST数据

  MNIST数据集只要一行代码就可以获取的到,非常方便。关于MNIST的基本信息可以参考我的上一篇随笔。

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

2、模型基本结构

  本次采用的训练模型为三层神经网络结构,输入层节点数与MNIST一行数据的长度一致,为784;输出层节点数与数字的类别数一致,为10;隐藏层节点数为50个;每次训练的mini-batch数量为64,;最大训练周期为50000。

 inputSize  = 784
outputSize = 10
hiddenSize = 50
batchSize = 64
trainCycle = 50000

3、输入层

  输入层用于接收每次小批量样本的输入,先通过placeholder来进行占位,在训练时才传入具体的数据。值得注意的是,在生成输入层的tensor时,传入的shape中有一个‘None’,表示每次输入的样本的数量,该‘None’表示先不作具体的指定,在真正输入的时候再根据实际的数据来进行推断。这个很方便,但也是有条件的,也就是通过该方法返回的tensor不能使用简单的加(+)减(-)乘(*)除(/)符号来进行计算(否则将会报错),需要用TensorFlow中的相关函数来进行代替。

inputLayer = tf.placeholder(tf.float32, shape=[None, inputSize])

4、隐藏层

  在神经网络中,隐藏层的作用主要是提取数据的特征(feature)。这里的权重参数采用了 tensorflow.truncated_normal() 函数来进行生成,与上次采用的 tensorflow.

random_normal() 不一样。这两者的作用都是生成指定形状、期望和标准差的符合正太分布随机变量。区别是 truncated_normal 函数对随机变量的范围有个限制(与期望的偏差在2个标准差之内,否则丢弃)。另外偏差项这里也使用了变量的形式,也可以采用常量来进行替代。

  激活函数为sigmoid函数。

 hiddenWeight = tf.Variable(tf.truncated_normal([inputSize, hiddenSize], mean=0, stddev=0.1))
hiddenBias = tf.Variable(tf.truncated_normal([hiddenSize]))
hiddenLayer = tf.add(tf.matmul(inputLayer, hiddenWeight), hiddenBias)
hiddenLayer = tf.nn.sigmoid(hiddenLayer)

5、输出层

  输出层与隐藏层类似,只是节点数不一样。

 outputWeight = tf.Variable(tf.truncated_normal([hiddenSize, outputSize], mean=0, stddev=0.1))
outputBias = tf.Variable(tf.truncated_normal([outputSize], mean=0, stddev=0.1))
outputLayer = tf.add(tf.matmul(hiddenLayer, outputWeight), outputBias)
outputLayer = tf.nn.sigmoid(outputLayer)

6、输出标签

  跟输入层一样,也是先占位,在最后训练的时候再传入具体的数据。标签,也就是每一个样本的正确分类。

outputLabel = tf.placeholder(tf.float32, shape=[None, outputSize])

7、损失函数

  这里采用的是交叉熵损失函数。注意用的是v2版本,第一个版本已被TensorFlow声明为deprecated,准备废弃了。

loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(labels=outputLabel, logits=outputLayer))

8、优化器与目标函数

  优化器采用了Adam梯度下降法,我试过了普通的GradientDescentOptimizer,效果不如Adam;也用过Adadelta,结果几乎收敛不了。

  目标函数就是最小化损失函数。

optimizer = tf.train.AdamOptimizer()
target = optimizer.minimize(loss)

9、训练过程

  先创建一个会话,然后初始化tensors,最后进行迭代训练。模型的收敛速度很快,在1000次的时候就达到了大概90%的正确率。

 with tf.Session() as sess:
sess.run(tf.global_variables_initializer()) for i in range(trainCycle):
batch = mnist.train.next_batch(batchSize)
sess.run(target, feed_dict={inputLayer: batch[0], outputLabel: batch[1]}) if i % 1000 == 0:
corrected = tf.equal(tf.argmax(outputLabel, 1), tf.argmax(outputLayer, 1))
accuracy = tf.reduce_mean(tf.cast(corrected, tf.float32))
accuracyValue = sess.run(accuracy, feed_dict={inputLayer: batch[0], outputLabel: batch[1]})
print(i, 'train set accuracy:', accuracyValue)

模型训练输出:

10、测试训练结果

  在测数据集上测试。准确率达到96%,比单层的神经网络好很多。

     corrected = tf.equal(tf.argmax(outputLabel, 1), tf.argmax(outputLayer, 1))
accuracy = tf.reduce_mean(tf.cast(corrected, tf.float32))
accuracyValue = sess.run(accuracy, feed_dict={inputLayer: mnist.test.images, outputLabel: mnist.test.labels})
print("accuracy on test set:", accuracyValue)

测试集上的输出:

附:

  完整代码如下:

 import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets('./data/mnist', one_hot=True) inputSize = 784
outputSize = 10
hiddenSize = 50
batchSize = 64
trainCycle = 50000 # 输入层
inputLayer = tf.placeholder(tf.float32, shape=[None, inputSize]) # 隐藏层
hiddenWeight = tf.Variable(tf.truncated_normal([inputSize, hiddenSize], mean=0, stddev=0.1))
hiddenBias = tf.Variable(tf.truncated_normal([hiddenSize]))
hiddenLayer = tf.add(tf.matmul(inputLayer, hiddenWeight), hiddenBias)
hiddenLayer = tf.nn.sigmoid(hiddenLayer) # 输出层
outputWeight = tf.Variable(tf.truncated_normal([hiddenSize, outputSize], mean=0, stddev=0.1))
outputBias = tf.Variable(tf.truncated_normal([outputSize], mean=0, stddev=0.1))
outputLayer = tf.add(tf.matmul(hiddenLayer, outputWeight), outputBias)
outputLayer = tf.nn.sigmoid(outputLayer) # 标签
outputLabel = tf.placeholder(tf.float32, shape=[None, outputSize]) # 损失函数
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(labels=outputLabel, logits=outputLayer)) # 优化器
optimizer = tf.train.AdamOptimizer() # 训练目标
target = optimizer.minimize(loss) # 训练
with tf.Session() as sess:
sess.run(tf.global_variables_initializer()) for i in range(trainCycle):
batch = mnist.train.next_batch(batchSize)
sess.run(target, feed_dict={inputLayer: batch[0], outputLabel: batch[1]}) if i % 1000 == 0:
corrected = tf.equal(tf.argmax(outputLabel, 1), tf.argmax(outputLayer, 1))
accuracy = tf.reduce_mean(tf.cast(corrected, tf.float32))
accuracyValue = sess.run(accuracy, feed_dict={inputLayer: batch[0], outputLabel: batch[1]})
print(i, 'train set accuracy:', accuracyValue) # 测试
corrected = tf.equal(tf.argmax(outputLabel, 1), tf.argmax(outputLayer, 1))
accuracy = tf.reduce_mean(tf.cast(corrected, tf.float32))
accuracyValue = sess.run(accuracy, feed_dict={inputLayer: mnist.test.images, outputLabel: mnist.test.labels})
print("accuracy on test set:", accuracyValue) sess.close()

本文地址:https://www.cnblogs.com/laishenghao/p/9736696.html

TensorFlow 训练MNIST数据集(2)—— 多层神经网络的更多相关文章

  1. TensorFlow训练MNIST数据集(3) —— 卷积神经网络

    前面两篇随笔实现的单层神经网络 和多层神经网络, 在MNIST测试集上的正确率分别约为90%和96%.在换用多层神经网络后,正确率已有很大的提升.这次将采用卷积神经网络继续进行测试. 1.模型基本结构 ...

  2. TensorFlow训练MNIST数据集(1) —— softmax 单层神经网络

    1.MNIST数据集简介 首先通过下面两行代码获取到TensorFlow内置的MNIST数据集: from tensorflow.examples.tutorials.mnist import inp ...

  3. 2、TensorFlow训练MNIST

    装载自:http://www.tensorfly.cn/tfdoc/tutorials/mnist_beginners.html TensorFlow训练MNIST 这个教程的目标读者是对机器学习和T ...

  4. 使用caffe训练mnist数据集 - caffe教程实战(一)

    个人认为学习一个陌生的框架,最好从例子开始,所以我们也从一个例子开始. 学习本教程之前,你需要首先对卷积神经网络算法原理有些了解,而且安装好了caffe 卷积神经网络原理参考:http://cs231 ...

  5. 实践详细篇-Windows下使用VS2015编译的Caffe训练mnist数据集

    上一篇记录的是学习caffe前的环境准备以及如何创建好自己需要的caffe版本.这一篇记录的是如何使用编译好的caffe做训练mnist数据集,步骤编号延用上一篇 <实践详细篇-Windows下 ...

  6. 一个简单的TensorFlow可视化MNIST数据集识别程序

    下面是TensorFlow可视化MNIST数据集识别程序,可视化内容是,TensorFlow计算图,表(loss, 直方图, 标准差(stddev)) # -*- coding: utf-8 -*- ...

  7. MNIST数据集上卷积神经网络的简单实现(使用PyTorch)

    设计的CNN模型包括一个输入层,输入的是MNIST数据集中28*28*1的灰度图 两个卷积层, 第一层卷积层使用6个3*3的kernel进行filter,步长为1,填充1.这样得到的尺寸是(28+1* ...

  8. TensorFlow训练MNIST报错ResourceExhaustedError

    title: TensorFlow训练MNIST报错ResourceExhaustedError date: 2018-04-01 12:35:44 categories: deep learning ...

  9. 基于 tensorflow 的 mnist 数据集预测

    1. tensorflow 基本使用方法 2. mnist 数据集简介与预处理 3. 聚类算法模型 4. 使用卷积神经网络进行特征生成 5. 训练网络模型生成结果 how to install ten ...

随机推荐

  1. Oracle EBS INV创建保留

    CREATE or REPPLACE PROCEDURE CreateReservation AS -- Common Declarations l_api_version NUMBER := 1.0 ...

  2. IP解析计算机名称

    #-*- coding: UTF-8 -*- import subprocess,sys,threading reload(sys) sys.setdefaultencoding('utf-8') d ...

  3. DELL MD3200i存储控制器解锁方法

    DELL MD3200i存储控制器解锁方法 现有一台DELL MD3200i存储,因种种原因导致控制器被锁定,这里是刚出厂的一台存储,出现这个问题让我们都很困惑,只能怀疑DELL公司的问题. 这台存储 ...

  4. Vue以CDN方式调用Swiper轮播异常

    问题概览: 有一个小型单页应用项目,嫌用组件式调用vue-swiper麻烦,因此以CDN的方式调用swiper,结果轮播的图不动了! 爬了半天百度和谷歌都无解决方案,最后曲线救国的方式解决了问题. 解 ...

  5. 面向对象程序设计__Task6_Calculator1.6.2

    The 4th part of the Calculator program _ Interface 题目链接:第六次作业(计算器第四步) github链接:Calculator_1.6.2 第六次作 ...

  6. PyQt5---ChangeIcon

    # -*- coding:utf-8 -*- ''' Created on Sep 13, 2018 @author: SaShuangYiBing ''' import sys from PyQt5 ...

  7. 6.基本数据结构-双端队列(Deque)

    一.双端队列(Deque) - 概念:deque(也称为双端队列)是与队列类似的项的有序集合.它有两个端部,首部和尾部,并且项在集合中保持不变. - 特性:deque 特殊之处在于添加和删除项是非限制 ...

  8. linux下的“定时器”:crontab

    1.概述 crontab是用来设置在固定时间点或时间间隔执行某条指令,类似于时程表.使用-u user是指定user用户的时程表. 2.参数 -e[UserName] :调出编辑器,编辑定时任务,打开 ...

  9. 敲代码非常难之logstash之file input插件实现分析

    版权声明:本文为横云断岭原创文章,未经博主同意不得转载.微信公众号:横云断岭的专栏 https://blog.csdn.net/hengyunabc/article/details/25665877 ...

  10. BZOJ2079:[POI2010]Guilds(乱搞)

    Description Zy皇帝面临一个严峻的问题,两个互相抵触的贸易团体,YYD工会和FSR工会,他们在同一时间请求在王国各个城市开办自己的办事处.这里有n个城市,其中有一些以双向马路相连,这两个工 ...