您的位置:首页 > 其它

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,这样可以达到模型最好的预测效果。

# -*- 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会有更高的准确率,能真正满足识别银行支票这种高精度系统的要求。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: