[DL] Recognize blurry handwritten digits in pictures

MNIST is an entry-level computer vision dataset. When we start learning programming, the first thing is often learning to print Hello World. In the field of introductory machine learning, we will use the MNIST dataset to experiment with various models.

#自动下载与安装MNIST数据集
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

#打印MNIST中信息
print('输入数据:', mnist.train.images)
print('训练数据的shape:', mnist.train.images.shape)   #输入数据的shape: (55000, 784)  55000张图片  一张图片为784(28×28)像素
print('测试数据的shape:', mnist.test.images.shape)
print('验证数据的shape:', mnist.validation.images.shape)

import pylab
im = mnist.train.images[100]    #第100张图片
im = im.reshape(-1, 28)
pylab.imshow(im)
pylab.show()

tf.reset_default_graph()
#定义占位符
#MNISRT数据集的维度是28×28=784 None代表第一个维度可以是任何长度。
# X代表能够输入任意数量的MNIST图像,每一张图展平成784维的向量
x = tf.placeholder(tf.float32, [None, 784])
y = tf.placeholder(tf.float32, [None, 10])     #数字0~9,共10个类别

#定义学习参数   一个Variable代表一个可修改的张量
W = tf.Variable(tf.random_normal([784, 10]))
b = tf.Variable(tf.zeros([10]))

pred = tf.nn.softmax(tf.matmul(x,W) + b)   #softmax分类   构建正向传播结构 表明只要模型中参数合适,通过具体的数据输入,就能得到我们想要的分类

#定义一个反向传播结构,编译训练模型,以得到合适的参数
#损失函数
cost = tf.reduce_mean(-tf.reduce_sum(y * tf.log(pred), reduction_indices=1))
#定义参数
learning_rate = 0.01
#使用梯度下降优化器
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)

training_epochs = 25   #整个样本集迭代25次
batch_size = 100       #训练过程中一次取100条数据进行训练
display_step = 1       #训练一次就把具体的中间状态显示出来

#启动session
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())   #初始化OP   运行初始化

    #启动循环开始训练
    for epoch in range(training_epochs):
        avg_cost = 0
        total_batch = int(mnist.train.num_examples/batch_size)
        #循环所有数据集
        for i in range(total_batch):
            batch_xs, batch_ys = mnist.train.next_batch(batch_size)
            #运行优化器
            _, c = sess.run([optimizer, cost], feed_dict={x: batch_xs, y: batch_ys})
            #计算平均loss值
            avg_cost += c/total_batch
        #显示训练中的详细信息
        if (epoch+1) % display_step == 0:
            print("Epoch:", '%04d'%(epoch+1), "cost=", "{:.9f}".format(avg_cost))

    print("Finished!")

    #测试model
    #由于是onehot编码,这里使用s了tf.argmax函数返回onehot编码中数值为1的那个元素的下标
    correct_prediction = tf.equal(tf.argmax(pred, 1), tf.argmax(y, 1))
    #计算准确率
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
    print("Accuracy:", accuracy.eval({x:mnist.test.images, y:mnist.test.labels}))  #eval函数就是实现list、dict、tuple与str之间的转化

    #保存模型
    saver = tf.train.Saver()
    model_path = './mnist_model_save.cpkt'
    save_path = saver.save(sess, model_path)
    print("Model saved in file: %s" % save_path)
import tensorflow as tf
from MNIST_1 import pred, x, y, mnist
import pylab
saver = tf.train.Saver()
model_path = './mnist_model_save.cpkt'
#读取模型
print("Starting 2nd session...")
with tf.Session() as sess:
    #初始化变量
    sess.run(tf.global_variables_initializer())
    #恢复模型变量
    saver.restore(sess, model_path)
    #测试model
    correct_prediction = tf.equal(tf.argmax(pred, 1), tf.argmax(y, 1))
    #计算准确率
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
    print("Accuracy:", accuracy.eval({x: mnist.test.images, y: mnist.test.labels}))

    output = tf.argmax(pred, 1)
    batch_xs, batch_ys = mnist.train.next_batch(2)
    outputval, predv = sess.run([output, pred], feed_dict={x: batch_xs})
    print(outputval, predv, batch_ys)

    im = batch_xs[0]
    im = im.reshape(-1, 28)
    pylab.imshow(im)
    pylab.show()

    im = batch_xs[1]
    im = im.reshape(-1, 28)
    pylab.imshow(im)
    pylab.show()

Reference from "Introduction, Principles and Advanced Practice of Tensor Flow in Deep Learning" - Li Jinhong

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=324685749&siteId=291194637