单层神经网络实现手写数字识别

Mnist手写数字识别

前言

Mnist数据集可以从官网下载,网址: http://yann.lecun.com/exdb/mnist/ 下载下来的数据集被分成两部分: 55000行的训练数据集(mnist.train) 和10000行的测试数据集(mnist.test) 。每一个MNIST数据单元有两部分组成: 一张包含手写数字的图片和一个对应的标签。我们把这些图片设为“xs",把这些标签设为"ys"。训练数据集和测试数据集都包含xs和ys,比如训练数据集的图片是mnist.train.images,训练数据集的标签是mnist.train.labels.

分析

我们可以知道图片是黑白图片,每一张图片包含28像素X28像素。我们把这个数组展开成一个向量,长度是28x28= 784。因此,在MNIST训练数据集中,mnist.train.images 是一个形状为[55000, 784]的张量。(55000张图片,784个特征值)
单层神经网络实现手写数字识别_第1张图片

MNIST中的每个图像都具有相应的标签,0到9之间的数字表示图像中绘制的数字。用的是one-hot编码nn[0, 0,0, 1, 0,0, 0, 0,0, 0] mnist. train. labels [55000, 10](10个目标数据,“0”,“1”,…,“9”)
单层神经网络实现手写数字识别_第2张图片

代码演示


import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'


from tensorflow.examples.tutorials.mnist import input_data



def full_connect():
    '''
    利用mnist数据集,实现手写数字识别
    :return: None
    '''

    # 获取数据
    mnist = input_data.read_data_sets("./data/mnist/input_data", one_hot=True)

    # 建立数据的占位符 x[None,784](特征值) y_true[None,10](目标值)
    with tf.variable_scope("data"):
        x = tf.placeholder(tf.float32,[None,784])

        # one-hot编码类型
        y_true = tf.placeholder(tf.int32,[None,10])

    # 建立全连接层的神经网络 weight [784,10](权重) bias[10](偏置)
    with tf.variable_scope("fc_model"):
        # 随机初始化权重和偏置
        weight = tf.Variable(tf.random_normal([784,10],mean=0.0,stddev=1.0),name="weight")
        bias = tf.Variable(tf.constant(0.0,shape=[10]))

        # 预测None个样本输出结果(matrix) [None,784] * [784,10]+ [10] = [None,10]
        y_predict = tf.matmul(x,weight) + bias

    # 求出所有样本损失,计算平均值
    with tf.variable_scope("soft_cros"):
        # 计算平均交叉熵损失
        loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_true,logits=y_predict))

    # 梯度下降求出损失
    with tf.variable_scope("optimizer"):
        train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)

    # 计算准确率
    with tf.variable_scope("accuracy"):
        # 进行比较
        equal_list = tf.equal(tf.argmax(y_true,1),tf.argmax(y_predict,1))

        # 求平均值 equal_list None个样本 类似:【1,0,1,1,1,0....,1,0】
        accuracy = tf.reduce_mean(tf.cast(equal_list,tf.float32))

    # 定义一个初始化变量的op
    init_op = tf.global_variables_initializer()

    #开启会话训练
    with tf.Session() as sess:
        # 初始化变量
        sess.run(init_op)

        # 迭代,进行训练,更新参数预测
        for i in range(2000):

            # 从数据中取出真实存在的特征值和目标值
            mnist_x , mnist_y = mnist.train.next_batch(50)

            # 进行训练
            sess.run(train_op,feed_dict={
     x:mnist_x,y_true:mnist_y})

            print("训练第%d步,准确率为%f" % (i, sess.run(accuracy,feed_dict={
     x:mnist_x,y_true:mnist_y})))
            # print("训练第%d步,准确率为:%f" % (i, sess.run(accuracy, feed_dict={x: mnist_x, y_true: mnist_y})))

    return None


if __name__ == "__main__":
    full_connect()


因为数据太多,我们不可能在控制台打印出所有数据,所以我们只在控制台打印出准确率,其他数据通过tensorboard观察。
单层神经网络实现手写数字识别_第3张图片

收集变量,并添加如下代码,在会话开启之前:

    # 收集变量 单个数值收集
    tf.summary.scalar("losses",loss)
    tf.summary.scalar("accuracy",accuracy)

    #高纬度变量收集
    tf.summary.histogram("weight",weight)
    tf.summary.histogram("bias",bias)
    
    #定义一个合并变量的op
    merged = tf.summary.merge_all()

并在会话中添加如下代码:

            #写入每一步训练的值
            summary = sess.run(merged,feed_dict={
     x:mnist_x,y_true:mnist_y})

            filewriter.add_summary(summary,i)

最终代码


import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'


from tensorflow.examples.tutorials.mnist import input_data



def full_connect():
    '''
    利用mnist数据集,实现手写数字识别
    :return: None
    '''

    # 获取数据
    mnist = input_data.read_data_sets("./data/mnist/input_data", one_hot=True)

    # 建立数据的占位符 x[None,784](特征值) y_true[None,10](目标值)
    with tf.variable_scope("data"):
        x = tf.placeholder(tf.float32,[None,784])

        # one-hot编码类型
        y_true = tf.placeholder(tf.int32,[None,10])

    # 建立全连接层的神经网络 weight [784,10](权重) bias[10](偏置)
    with tf.variable_scope("fc_model"):
        # 随机初始化权重和偏置
        weight = tf.Variable(tf.random_normal([784,10],mean=0.0,stddev=1.0),name="weight")
        bias = tf.Variable(tf.constant(0.0,shape=[10]))

        # 预测None个样本输出结果(matrix) [None,784] * [784,10]+ [10] = [None,10]
        y_predict = tf.matmul(x,weight) + bias

    # 求出所有样本损失,计算平均值
    with tf.variable_scope("soft_cros"):
        # 计算平均交叉熵损失
        loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_true,logits=y_predict))

    # 梯度下降求出损失
    with tf.variable_scope("optimizer"):
        train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)

    # 计算准确率
    with tf.variable_scope("accuracy"):
        # 进行比较
        equal_list = tf.equal(tf.argmax(y_true,1),tf.argmax(y_predict,1))

        # 求平均值 equal_list None个样本 类似:【1,0,1,1,1,0....,1,0】
        accuracy = tf.reduce_mean(tf.cast(equal_list,tf.float32))


    # 定义一个初始化变量的op
    init_op = tf.global_variables_initializer()

    # 收集变量 单个数值收集
    tf.summary.scalar("losses",loss)
    tf.summary.scalar("accuracy",accuracy)

    #高纬度变量收集
    tf.summary.histogram("weight",weight)
    tf.summary.histogram("bias",bias)

    #定义一个合并变量的op
    merged = tf.summary.merge_all()

    #开启会话训练
    with tf.Session() as sess:
        # 初始化变量
        sess.run(init_op)

        # 建立events文件,然后写入
        filewriter = tf.summary.FileWriter("./tmp/summary/test/",graph=sess.graph)

        # 迭代,进行训练,更新参数预测
        for i in range(2000):

            # 从数据中取出真实存在的特征值和目标值
            mnist_x , mnist_y = mnist.train.next_batch(50)

            # 进行训练
            sess.run(train_op,feed_dict={
     x:mnist_x,y_true:mnist_y})

            #写入每一步训练的值
            summary = sess.run(merged,feed_dict={
     x:mnist_x,y_true:mnist_y})

            filewriter.add_summary(summary,i)

            print("训练第%d步,准确率为%f" % (i, sess.run(accuracy,feed_dict={
     x:mnist_x,y_true:mnist_y})))
            # print("训练第%d步,准确率为:%f" % (i, sess.run(accuracy, feed_dict={x: mnist_x, y_true: mnist_y})))

    return None


if __name__ == "__main__":
    full_connect()


单层神经网络实现手写数字识别_第4张图片
单层神经网络实现手写数字识别_第5张图片

最终代码


import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'


from tensorflow.examples.tutorials.mnist import input_data

FLAGS = tf.app.flags.FLAGS
tf.app.flags.DEFINE_integer("is_train", 1, "指定程序是预测还是训练")

def full_connect():
    '''
    利用mnist数据集,实现手写数字识别
    :return: None
    '''

    # 获取数据
    mnist = input_data.read_data_sets("./tmp/data/mnist/input_data", one_hot=True)

    # 建立数据的占位符 x[None,784](特征值) y_true[None,10](目标值)
    with tf.variable_scope("data"):
        x = tf.placeholder(tf.float32,[None,784])

        # one-hot编码类型
        y_true = tf.placeholder(tf.int32,[None,10])

    # 建立全连接层的神经网络 weight [784,10](权重) bias[10](偏置)
    with tf.variable_scope("fc_model"):
        # 随机初始化权重和偏置
        weight = tf.Variable(tf.random_normal([784,10],mean=0.0,stddev=1.0),name="weight")
        bias = tf.Variable(tf.constant(0.0,shape=[10]))

        # 预测None个样本输出结果(matrix) [None,784] * [784,10]+ [10] = [None,10]
        y_predict = tf.matmul(x,weight) + bias

    # 求出所有样本损失,计算平均值
    with tf.variable_scope("soft_cros"):
        # 计算平均交叉熵损失
        loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_true,logits=y_predict))

    # 梯度下降求出损失
    with tf.variable_scope("optimizer"):
        train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)

    # 计算准确率
    with tf.variable_scope("accuracy"):
        # 进行比较
        equal_list = tf.equal(tf.argmax(y_true,1),tf.argmax(y_predict,1))

        # 求平均值 equal_list None个样本 类似:【1,0,1,1,1,0....,1,0】
        accuracy = tf.reduce_mean(tf.cast(equal_list,tf.float32))


    # 定义一个初始化变量的op
    init_op = tf.global_variables_initializer()

    # 收集变量 单个数值收集
    tf.summary.scalar("losses",loss)
    tf.summary.scalar("accuracy",accuracy)

    #高纬度变量收集
    tf.summary.histogram("weight",weight)
    tf.summary.histogram("bias",bias)

    # 定义一个合并变量的op
    merged = tf.summary.merge_all()

    # 创建一个saver
    saver = tf.train.Saver()

    #开启会话训练
    with tf.Session() as sess:
        # 初始化变量
        sess.run(init_op)

        # 建立events文件,然后写入
        filewriter = tf.summary.FileWriter("./tmp/summary/test/",graph=sess.graph)

        if FLAGS.is_train ==1:

            # 迭代,进行训练,更新参数预测
            for i in range(10000):
                # 从数据中取出真实存在的特征值和目标值
                mnist_x, mnist_y = mnist.train.next_batch(50)

                # 进行训练
                sess.run(train_op, feed_dict={
     x: mnist_x, y_true: mnist_y})

                # 写入每一步训练的值
                summary = sess.run(merged, feed_dict={
     x: mnist_x, y_true: mnist_y})

                filewriter.add_summary(summary, i)

                print("训练第%d步,准确率为%f" % (i, sess.run(accuracy, feed_dict={
     x: mnist_x, y_true: mnist_y})))

            # 保存模型
            saver.save(sess, "./tmp/ckpt/fe_model.ckpt")

        else:
            # 加载模型
            saver.restore(sess, "./tmp/ckpt/fe_model.ckpt")

            # 如果是0,做出预测
            for i in range(100):
                # 每次测试一张图片 [0,0,0,0,0,1,0,0,0,0]
                x_test, y_test = mnist.test.next_batch(1)

                print("第%d张图片,手写数字图片目标是:%d, 预测结果是:%d" % (
                    i,
                    tf.argmax(y_test, 1).eval(),
                    tf.argmax(sess.run(y_predict, feed_dict={
     x: x_test, y_true: y_test}), 1).eval()
                ))
    return None


if __name__ == "__main__":
    full_connect()


先运行程序进行训练,小编这里采用if判断是进行训练还是测试。
单层神经网络实现手写数字识别_第6张图片
训练完之后,输入 python xxx.py --is_train=0,进行测试
单层神经网络实现手写数字识别_第7张图片单层神经网络实现手写数字识别_第8张图片

你可能感兴趣的:(人工智能,tensorflow,深度学习,神经网络,python,计算机视觉)