使用tensorflow构建一个单层的手写数字识别

本篇文章主要介绍使用tensorflow来构建一个单层的神经网络模型,最终模型在训练集和测试集上的准确率可以达到92%,整个过程主要分为六个步骤。

1、导入相关函数和模块
from tensorflow.examples.tutorials.mnist import input_data
import tensorflow as tf
 2、使用tensorflow下载MNIST数据集

整个数据集一共包含70000张图片,其中有55000张图片是训练集,5000张图片是验证集,10000张图片是测试集,每张图片都是单通道图片,一共包含0到9十种不同的手写数字图片。

    #加载数据
    mnist_data = input_data.read_data_sets("MNIST_data/",one_hot=True)
    #获取训练数据
    train_data = mnist_data.train
    #获取验证数据
    validation_data = mnist_data.validation
    #获取测试数据
    test_data = mnist_data.test
3、定义相关变量

我们将每张图片28×28×1=784,转变成为一个784维的向量,在这里我们忽略了图片的位置信息,后面介绍使用卷积神经网络来识别手写数字就考虑了图片的位置信息。定义一个输入X和输出Y_使用tensorflow的placeholder进行定义,输入X是一个784维的相量,输出是一个10维的向量通过softmax函数输出对应该图片属于0到9的概率,使用Variable来定义一个权重W,和截距b。

    #定义权重
    w = tf.Variable(tf.zeros([784,10],dtype=tf.float32))
    #定义偏置
    b = tf.Variable(tf.zeros([10]),dtype=tf.float32)
    #计算输出y
    Y = tf.nn.softmax(tf.matmul(X,w)+b)
    #定义预测时的输出
    Y_ = tf.placeholder(tf.float32,[None,10])
4、定义损失函数选择优化算法

对于分类问题我们可以采用交叉熵作为损失函数,在本篇文章中,选择交叉熵的平均值作为损失函数。使用梯度下降算法作为优化算法来使得损失函数最小化。

    #定义损失函数
    loss_func = tf.reduce_mean(-tf.reduce_sum(Y_ * tf.log(Y),reduction_indices=[1]))
    #定义训练时候的优化函数
    train_step = tf.train.GradientDescentOptimizer(0.01).minimize(loss_func)
5、开始迭代训练模型

在训练模型之前需要先创建一个session会话,然后初始化变量,这里每次迭代的时候只使用了100张图片进行训练。 

    #定义一个交互式的会话
    sess = tf.InteractiveSession()
    #初始化变量
    tf.global_variables_initializer().run()
    #开始迭代
    for i in range(100000):
        #每次获取一小块的数据
        batch_xs,batch_ys = train_data.next_batch(100)
        train_step.run({X:batch_xs,Y_:batch_ys})
6、评估模型的准确率

tf.argmax函数返回的是一个索引下标,通过equal函数来比较预测值和实际值是否相等,返回一个bool类型的变量,通过cast函数可以将bool类型转换成为整数类型(0表示false,1表示true),最后再通过平均值来表示准确率。

    #计算准确率
    correct_pred = tf.equal(tf.argmax(Y,1),tf.argmax(Y_,1))
    accuracy = tf.reduce_mean(tf.cast(correct_pred,tf.float32))
    #计算模型在训练集上的准确率
    print("train accray:%.4f"%accuracy.eval({X:train_data.images,Y_:train_data.labels}))
    #计算模型在测试集上的准确率
    print("test accuracy:%.4f"%accuracy.eval({X:test_data.images,Y_:test_data.labels}))
    '''
    train accray:0.9257
    test accuracy:0.9221
    '''

完整代码如下:

from tensorflow.examples.tutorials.mnist import input_data
import tensorflow as tf

if __name__ == "__main__":
    #加载数据
    mnist_data = input_data.read_data_sets("MNIST_data/",one_hot=True)
    #获取训练数据
    train_data = mnist_data.train
    #获取验证数据
    validation_data = mnist_data.validation
    #获取测试数据
    test_data = mnist_data.test
    #定义输入变量X
    X = tf.placeholder(tf.float32,[None,784])
    #定义权重
    w = tf.Variable(tf.zeros([784,10],dtype=tf.float32))
    #定义偏置
    b = tf.Variable(tf.zeros([10]),dtype=tf.float32)
    #计算输出y
    Y = tf.nn.softmax(tf.matmul(X,w)+b)
    #定义预测时的输出
    Y_ = tf.placeholder(tf.float32,[None,10])
    #定义损失函数
    loss_func = tf.reduce_mean(-tf.reduce_sum(Y_ * tf.log(Y),reduction_indices=[1]))
    #定义训练时候的优化函数
    train_step = tf.train.GradientDescentOptimizer(0.01).minimize(loss_func)
    #定义一个交互式的会话
    sess = tf.InteractiveSession()
    #初始化变量
    tf.global_variables_initializer().run()
    #开始迭代
    for i in range(100000):
        #每次获取一小块的数据
        batch_xs,batch_ys = train_data.next_batch(100)
        train_step.run({X:batch_xs,Y_:batch_ys})
    #计算准确率
    correct_pred = tf.equal(tf.argmax(Y,1),tf.argmax(Y_,1))
    accuracy = tf.reduce_mean(tf.cast(correct_pred,tf.float32))
    #计算模型在训练集上的准确率
    print("train accray:%.4f"%accuracy.eval({X:train_data.images,Y_:train_data.labels}))
    #计算模型在测试集上的准确率
    print("test accuracy:%.4f"%accuracy.eval({X:test_data.images,Y_:test_data.labels}))
    '''
    train accray:0.9257
    test accuracy:0.9221
    '''

猜你喜欢

转载自blog.csdn.net/sinat_29957455/article/details/80572980