TensorFlow笔记(二)---多层感知机识别手写数字
2018-03-08 11:48
253 查看
Softmax Regression无隐含层,在MNIST数据集上取得了大约92%的正确率,提高准确度,要给神经网络加上隐含层,并使用能减轻过拟合的Dropout,自适应学习速率的Adagrad以及可以解决梯度弥散的激活函数ReLU.
定义算法公式即神经网络前向(forward)时的计算
载入数据
隐层参数设置并初始化
Dropout的比率设置:在训练时应该小于1来制造随机性防止过拟合,在预测时应该等于1,用全部特征来预测样本的类别。
定义模型结构:
隐含层,dropout功能,输出层(softmax)
定义损失函数和选择优化器来优化loss
损失函数用交叉信息熵
优化器选择自适应的优化器Adagrad,把学习速率设为0.3
训练
加入keep_prob作为计算图的数日,在训练时设为0.75,即保留75%的节点,其余的25%设为0.
共采用3000个batch,每个batch包含100条样本,一共30万样本,相当于对全数据集进行了5轮(epoch)迭代。
对模型进行准确率评测
预测时将keep_prob直接设为1,这样可以达到模型最好的预测效果。
最终准确率大约98%,相比之前Softmax,误差率由8%下降到2%。没有隐含层的Softmax Regression只能直接从图像的像素点推断是哪个数字,而没有特征抽象的过程。多层神经网络依靠隐含层,则可以组合出高阶特征,eg横线、竖线、圆圈等,之后可以将这些高阶特征或者说组件再组合成数字,就能实现精确的匹配和分类。隐含层输出的高阶特征经常是可以复用的,所以每一类的判别、概率输出都共享这些高阶特征,而不是各自连接独立的高阶特征。
但是使用全连接神经网络(Fully Connected Network,FCN,MLP的另一种说法)也是有局限性的,即使我们使用很深的网络,很多隐藏节点,很大迭代轮数也很难在MNIST数据集上达到99%以上的准确率。有卷积神经网络CNN会有更高的准确率,能真正满足识别银行支票这种高精度系统的要求。
定义算法公式即神经网络前向(forward)时的计算
载入数据
隐层参数设置并初始化
Dropout的比率设置:在训练时应该小于1来制造随机性防止过拟合,在预测时应该等于1,用全部特征来预测样本的类别。
定义模型结构:
隐含层,dropout功能,输出层(softmax)
定义损失函数和选择优化器来优化loss
损失函数用交叉信息熵
优化器选择自适应的优化器Adagrad,把学习速率设为0.3
训练
加入keep_prob作为计算图的数日,在训练时设为0.75,即保留75%的节点,其余的25%设为0.
共采用3000个batch,每个batch包含100条样本,一共30万样本,相当于对全数据集进行了5轮(epoch)迭代。
对模型进行准确率评测
预测时将keep_prob直接设为1,这样可以达到模型最好的预测效果。
# -*- coding: utf-8 -*- """ Created on Wed Mar 7 16:31:56 2018 @author: wf """ from tensorflow.examples.tutorials.mnist import input_data import tensorflow as tf mnist=input_data.read_data_sets('MNIST_data/',one_hot=True)#导入数据 sess=tf.InteractiveSession()# in_units=784 #输入层节点数 h1_units=300 #隐含层节点数 W1=tf.Variable(tf.truncated_normal([in_units,h1_units],stddev=0.1))#初始化权重,w1截断分布,标准差0.1 b1=tf.Variable(tf.zeros([h1_units])) W2=tf.Variable(tf.zeros([h1_units,10])) b2=tf.Variable(tf.zeros([10])) #设置输入和drop比率输入 x=tf.placeholder(tf.float32,[None,in_units]) keep_prob=tf.placeholder(tf.float32) #定义模型的结构 hidden1=tf.nn.relu(tf.matmul(x,W1)+b1)#隐含层激活函数为relu hidden1_drop=tf.nn.dropout(hidden1,keep_prob)#隐含层drop out y=tf.nn.softmax(tf.matmul(hidden1_drop,W2)+b2)#输出激活函数为softmax #定义损失函数和选择优化器优化loss y_=tf.placeholder(tf.float32,[None,10]) cross_entropy=tf.reduce_mean(-tf.reduce_sum(y_*tf.log(y),reduction_indices=[1]))#设置损失函数为交叉熵 train_step=tf.train.AdagradOptimizer(0.3).minimize(cross_entropy) #定义梯度下降最小化损失函数 #train tf.global_variables_initializer().run()#全局初始化 for i in range(3000): batch_xs,batch_ys=mnist.train.next_batch(100)#获取batch train_step.run({x:batch_xs,y_:batch_ys,keep_prob:0.75})#开始训练 #准确率评估 correct_prediction=tf.equal(tf.argmax(y,1),tf.argmax(y_,1)) #判断类别 accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32)) print(accuracy.eval({x:mnist.test.images,y_:mnist.test.labels,keep_prob:1.0}))
最终准确率大约98%,相比之前Softmax,误差率由8%下降到2%。没有隐含层的Softmax Regression只能直接从图像的像素点推断是哪个数字,而没有特征抽象的过程。多层神经网络依靠隐含层,则可以组合出高阶特征,eg横线、竖线、圆圈等,之后可以将这些高阶特征或者说组件再组合成数字,就能实现精确的匹配和分类。隐含层输出的高阶特征经常是可以复用的,所以每一类的判别、概率输出都共享这些高阶特征,而不是各自连接独立的高阶特征。
但是使用全连接神经网络(Fully Connected Network,FCN,MLP的另一种说法)也是有局限性的,即使我们使用很深的网络,很多隐藏节点,很大迭代轮数也很难在MNIST数据集上达到99%以上的准确率。有卷积神经网络CNN会有更高的准确率,能真正满足识别银行支票这种高精度系统的要求。
相关文章推荐
- TensorFlow学习笔记(二):手写数字识别之多层感知机
- Tensorflow实战——利用多层感知机识别手写数字
- 学习笔记TF024:TensorFlow实现Softmax Regression(回归)识别手写数字
- 机器学习笔记:tensorflow实现卷积神经网络经典案例--识别手写数字
- TensorFlow笔记(三)--CNN识别手写数字
- TensorFlow学习笔记之源码分析(2)----手写数字识别mnist example
- TensorFlow笔记(一)---Softmax Regression识别手写数字
- 多层感知机实现mnist手写数字识别
- 【theano-windows】学习笔记十——多层感知机手写数字分类
- 基于TensorFlow解决手写数字识别的Softmax方法、多层卷积网络方法和前馈神经网络方法
- TensorFlow笔记之一:MNIST手写数字识别
- 学习笔记(五)Tensorflow实现Soft Regression简单识别MNIST手写数字
- TensorFlow学习笔记【二】 手写数字识别入门
- tensorflow 学习笔记9 卷积神经网络(CNN)实现mnist手写识别
- tensorflow入门-mnist手写数字识别(一)
- 训练Tensorflow识别手写数字 mnist
- Tensorflow训练识别手写数字0-9
- Tensorflow - Tutorial (2) : 利用softmax回归进行手写数字识别
- tensorflow识别手写数字(2)
- TensorFlow实现识别手写数字