TensorFlow小程序(四):MNIST数字识别(神经网络的优化)

从不同的方面对神经网络进行简单优化

1.代价函数

上一篇中我们用的是简单的二次函数(均方误差)作为代价函数

loss=tf.reduce_mean(tf.square(y-prediction)) #求预测的平均误差

这一节中我们进行了改进,采用交叉熵作为代价函数。交叉熵刻画了两个概率分布之间的距离,常用在分类问题中使用。交叉熵一般会与softmax回归一起使用
softmax回归本身可以作为一个学习算法来优化分离结果,但在Tensorflow中,softmax回归的参数被去掉了,它只是一层额外的处理层,将神经网络的输出编程一个概率分布。

loss=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y,logits=prediction))

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
mnist=input_data.read_data_sets("MNIST_data",one_hot=True)  #载入MINIST数据集,MINIST_data表示当前目录下的这个文件夹,也可以改为别的路径
batch_size=100 #每个批次大小
n_batch=mnist.train.num_examples//batch_size   #批次数目
x=tf.placeholder(tf.float32,[None,784])  #输入,输出占位符 28*28=784维
y=tf.placeholder(tf.float32,[None,10])  #输出一共为10个数字 y为标签
#创建一个简单的神经网络
W=tf.Variable(tf.zeros([784,10]),name='W')  #输入784,输出10
b=tf.Variable(tf.zeros([10]),name='b')
wx_plus_b=tf.matmul(x,W)+b
prediction=tf.nn.softmax(wx_plus_b) #将数值转换成预测概率
#交叉熵代价函数
loss=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y,logits=prediction))
#loss=tf.reduce_mean(tf.square(y-prediction))  #求预测的平均误差  二次代价函数
#使用梯度下降法
train_step=tf.train.GradientDescentOptimizer(0.3).minimize(loss)   #梯度下降法是误差减小,学习率为0.3
init=tf.global_variables_initializer()  #变量初始化
correct_prediction=tf.equal(tf.arg_max(y,1),tf.arg_max(prediction,1))  #arg_max返回一维张量中最大值所在的位置,将预测值与真实值用equal进行是否相等判断,结果为True或False
              #y是真实值  结果存放在布尔型列表中
accuary=tf.reduce_mean(tf.cast(correct_prediction,tf.float32)) #cast将correct_prediction中布尔型转化为float型,并求平均值,计算正确度
with tf.Session()as sess:
    sess.run(init)
    for epoch in range(20):  #共训练20次 所有的图片训练20次
        for batch in range(n_batch):   #训练一次,进行的次数
            batch_x,batch_y=mnist.train.next_batch(batch_size) #batch_size表示100张图片,取出待训练数字batch_x为图像,batch_y为标签
            sess.run(train_step,feed_dict={x:batch_x,y:batch_y})  #进行训练
        acc=sess.run(accuary,feed_dict={x:mnist.test.images,y:mnist.test.labels})  #计算准确率
        print("Iter"+str(epoch)+",Testing acc"+str(acc))

运行结果:
Iter0,Testing acc0.831
Iter1,Testing acc0.8994
Iter2,Testing acc0.9058
Iter3,Testing acc0.9108
Iter4,Testing acc0.9124
Iter5,Testing acc0.9139
Iter6,Testing acc0.9174
Iter7,Testing acc0.9186
Iter8,Testing acc0.9181
Iter9,Testing acc0.9194
Iter10,Testing acc0.92
Iter11,Testing acc0.921
Iter12,Testing acc0.9206
Iter13,Testing acc0.9221
Iter14,Testing acc0.9222
Iter15,Testing acc0.9228
Iter16,Testing acc0.9227
Iter17,Testing acc0.9231
Iter18,Testing acc0.9233
Iter19,Testing acc0.9233
结果与上一篇中的结果相比,精确度有了一些提高,但是提高的并不多。

2.优化器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值