使用tensorflow进行手写数字识别

首先要在对应的目录下安装好手写数字识别数据集。

编写代码如下所示:

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("F:/anaconda/workspace/Data/MNIST_data",one_hot=True)
#设置每个批次的大小,一次运算100张图片
batch_size = 100
#计算共有多少批次
n_batch = mnist.train.num_examples  // batch_size
#创建两个placeholder
x = tf.placeholder(tf.float32,[None,784])
y = tf.placeholder(tf.float32,[None,10])

#创建简单的神经网络
W = tf.Variable(tf.zeros([784,10]))
b = tf.Variable(tf.zeros([10]))
prediction = tf.nn.sigmoid(tf.matmul(x,W)+b)
#二次代价函数
# loss = tf.reduce_mean(tf.square(y-prediction))
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y, logits=prediction))
#使用梯度下降法
train_step = tf.train.GradientDescentOptimizer(0.2).minimize(loss)
# train_step = tf.train.AdamOptimizer(0.01).minimize(loss)
#初始化变量
init = tf.global_variables_initializer()

#结果存放在一个布尔类型列表中 argmax:返回一位张量中的最大值所在的位置(概率最大的位置)
correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(prediction,1))
#计算准确率 cast:把true转化为1.0,false转化为0.0
accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))

with tf.Session() as sess:
    sess.run(init)
    for epoch in range(21):
        for bach in range(n_batch):
            batch_xs,batch_ys = mnist.train.next_batch(batch_size)
            sess.run(train_step,feed_dict={x:batch_xs,y:batch_ys})
        #计算准确率
        acc = sess.run(accuracy,feed_dict={x:mnist.test.images,y:mnist.test.labels})
        print("Iter "+ str(epoch) + "Testing Accuracy "+ str(acc))

代价 函数可以更换,本文使用了两种代价函数,一个是二次代价函数另一个是交叉熵代价函数,进行20次训练后的准确率为:

#交叉熵
Iter 0Testing Accuracy 0.8666
Iter 1Testing Accuracy 0.8774
Iter 2Testing Accuracy 0.8841
Iter 3Testing Accuracy 0.8874
Iter 4Testing Accuracy 0.8895
Iter 5Testing Accuracy 0.893
Iter 6Testing Accuracy 0.8944
Iter 7Testing Accuracy 0.8971
Iter 8Testing Accuracy 0.8972
Iter 9Testing Accuracy 0.8968
Iter 10Testing Accuracy 0.8996
Iter 11Testing Accuracy 0.8998
Iter 12Testing Accuracy 0.9011
Iter 13Testing Accuracy 0.9014
Iter 14Testing Accuracy 0.9009
Iter 15Testing Accuracy 0.9014
Iter 16Testing Accuracy 0.9016
Iter 17Testing Accuracy 0.9021
Iter 18Testing Accuracy 0.9032
Iter 19Testing Accuracy 0.9034
Iter 20Testing Accuracy 0.903

#二次代价函数
Iter 0Testing Accuracy 0.8175
Iter 1Testing Accuracy 0.8515
Iter 2Testing Accuracy 0.8639
Iter 3Testing Accuracy 0.8709
Iter 4Testing Accuracy 0.8769
Iter 5Testing Accuracy 0.8809
Iter 6Testing Accuracy 0.8844
Iter 7Testing Accuracy 0.8865
Iter 8Testing Accuracy 0.8896
Iter 9Testing Accuracy 0.8907
Iter 10Testing Accuracy 0.8921
Iter 11Testing Accuracy 0.8933
Iter 12Testing Accuracy 0.8947
Iter 13Testing Accuracy 0.8962
Iter 14Testing Accuracy 0.8965
Iter 15Testing Accuracy 0.897
Iter 16Testing Accuracy 0.8985
Iter 17Testing Accuracy 0.8989
Iter 18Testing Accuracy 0.8994
Iter 19Testing Accuracy 0.8999
Iter 20Testing Accuracy 0.9005

看起来两者的差距并不是很大。在这里的代价函数和优化器自己可以调整。

 

更多内容请扫描下方二维码关注博主微信公众号:程序员大管

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章