Handwritten Digit Recognition MNIST with TensorFlow

Official Documentation:
MNIST For ML Beginners - https://www.tensorflow.org/get_started/mnist/beginners
Deep MNIST for Experts - https://www.tensorflow.org/get_started/mnist/pros

Version:
TensorFlow 1.2.0+ Flask 0.12 + Gunicorn 19.6

related articles:
TensorFlow's entry experience
TensorFlow's handwritten digit recognition MNIST
TensorFlow's object detection
TensorFlow's construction of a character recognition system

MNIST is equivalent to the Hello World of machine learning.

Here, a number is drawn on the page through Canvas, and then passed to TensorFlow for recognition, and the recognition results of the Softmax regression model and the multi-layer convolutional network are given respectively.

(1) File structure

│ main.py
│ requirements.txt
│ runtime.txt
├─mnist
│ │ convolutional.py
│ │ model.py │
│ regression.py
│ │ __init__.py
│ └─data
│ convolutional.ckpt.data-00000-of-00001
│ convolutional.ckpt.index
│ regression.ckpt.data-00000-of-00001
│ regression.ckpt.index
├─src
│ └─js
│ main. js
├─static
│ ├─css
│ │ bootstrap.min.css
│ └─js
│ jquery.min.js

main.js └─templates
        index.html

(2) Download the training data

and put the following files in /tmp/data/ , without decompression, the training code will be decompressed automatically.
quote
http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz
http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz
http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz
http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz


Execute command training data (Softmax regression model, multi-layer convolutional network)
# python regression.py
# python convolutional.py


After the execution is completed, the following files will be generated in mnist/data/. These files need to be deleted before retraining.
quote
convolutional.ckpt.data-00000-of-00001
convolutional.ckpt.index
regression.ckpt.data-00000-of-00001
regression.ckpt.index


(3) Start the web service test

# cd /usr/local/tensorflow2/tensorflow-models/tf-mnist
# pip install -r requirements.txt
# gunicorn main:app --log-file=- --bind=localhost:8000


Access in the browser: http://localhost:8000

*** The running version of TensorFlow, the model trained by the data, and the conversion of Canvas here all have a certain impact on the recognition rate~!

(4) The Web part of the source code

is relatively simple. A Canvas is placed on the page. When the mouse is lifted, the image of the Canvas is passed to the background API through Ajax, and then the API results are displayed.
quote
src/js/main.js -> static/js/main.js
templates/index.html


main.py
import numpy as np
import tensorflow as tf
from flask import Flask, jsonify, render_template, request

from mnist import model

x = tf.placeholder("float", [None, 784])
sex = tf.Session ()

# restore trained data
with tf.variable_scope("regression"):
    y1, variables = model.regression(x)
saver = tf.train.Saver(variables)
saver.restore(sess, "mnist/data/regression.ckpt")

with tf.variable_scope("convolutional"):
    keep_prob = tf.placeholder("float")
    y2, variables = model.convolutional(x, keep_prob)
saver = tf.train.Saver(variables)
saver.restore(sess, "mnist/data/convolutional.ckpt")

def regression(input):
    return sess.run(y1, feed_dict={x: input}).flatten().tolist()

def convolutional(input):
    return sess.run(y2, feed_dict={x: input, keep_prob: 1.0}).flatten().tolist()

# webapp
app = Flask(__name__)

@app.route('/api/mnist', methods=['POST'])
def mnist():
    input = ((255 - np.array(request.json, dtype=np.uint8)) / 255.0).reshape(1, 784)
    output1 = regression(input)
    output2 = convolutional(input)
    print(output1)
    print(output2)
    return jsonify(results=[output1, output2])

@app.route('/')
def main():
    return render_template('index.html')

if __name__ == '__main__':
    app.run()


mnist/model.py
import tensorflow as tf


# Softmax Regression Model
def regression(x):
    W = tf.Variable(tf.zeros([784, 10]), name="W")
    b = tf.Variable(tf.zeros([10]), name="b")
    y = tf.nn.softmax(tf.matmul(x, W) + b)
    return y, [W, b]


# Multilayer Convolutional Network
def convolutional(x, keep_prob):
    def conv2d(x, W):
        return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')

    def max_pool_2x2(x):
        return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')

    def weight_variable(shape):
        initial = tf.truncated_normal(shape, stddev=0.1)
        return tf.Variable(initial)

    def bias_variable(shape):
        initial = tf.constant(0.1, shape=shape)
        return tf.Variable(initial)

    # First Convolutional Layer
    x_image = tf.reshape(x, [-1, 28, 28, 1])
    W_conv1 = weight_variable([5, 5, 1, 32])
    b_conv1 = bias_variable([32])
    h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)
    h_pool1 = max_pool_2x2(h_conv1)
    # Second Convolutional Layer
    W_conv2 = weight_variable([5, 5, 32, 64])
    b_conv2 = bias_variable([64])
    h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)
    h_pool2 = max_pool_2x2(h_conv2)
    # Densely Connected Layer
    W_fc1 = weight_variable([7 * 7 * 64, 1024])
    b_fc1 = bias_variable([1024])
    h_pool2_flat = tf.reshape(h_pool2, [-1, 7*7*64])
    h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)
    # Dropout
    h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)
    # Readout Layer
    W_fc2 = weight_variable([1024, 10])
    b_fc2 = bias_variable([10])
    y = tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2)
    return y, [W_conv1, b_conv1, W_conv2, b_conv2, W_fc1, b_fc1, W_fc2, b_fc2]


mnist/convolutional.py
import them
import model
import tensorflow as tf

from tensorflow.examples.tutorials.mnist import input_data
data = input_data.read_data_sets("/tmp/data/", one_hot=True)

# model
with tf.variable_scope("convolutional"):
    x = tf.placeholder(tf.float32, [None, 784])
    keep_prob = tf.placeholder(tf.float32)
    y, variables = model.convolutional(x, keep_prob)

# train
y_ = tf.placeholder(tf.float32, [None, 10])
cross_entropy = -tf.reduce_sum(y_ * tf.log(y))
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

saver = tf.train.Saver(variables)
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for i in range(20000):
        batch = data.train.next_batch(50)
        if i % 100 == 0:
            train_accuracy = accuracy.eval(feed_dict={x: batch[0], y_: batch[1], keep_prob: 1.0})
            print("step %d, training accuracy %g" % (i, train_accuracy))
        sess.run(train_step, feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5})

    print(sess.run(accuracy, feed_dict={x: data.test.images, y_: data.test.labels, keep_prob: 1.0}))

    path = saver.save(
        sess, os.path.join(os.path.dirname(__file__), 'data', 'convolutional.ckpt'),
        write_meta_graph=False, write_state=False)
    print("Saved:", path)


mnist/regression.py
import them
import model
import tensorflow as tf

from tensorflow.examples.tutorials.mnist import input_data
data = input_data.read_data_sets("/tmp/data/", one_hot=True)

# model
with tf.variable_scope("regression"):
    x = tf.placeholder(tf.float32, [None, 784])
    y, variables = model.regression(x)

# train
y_ = tf.placeholder("float", [None, 10])
cross_entropy = -tf.reduce_sum(y_ * tf.log(y))
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

saver = tf.train.Saver(variables)
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for _ in range(1000):
        batch_xs, batch_ys = data.train.next_batch(100)
        sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

    print(sess.run(accuracy, feed_dict={x: data.test.images, y_: data.test.labels}))

    path = saver.save(
        sess, os.path.join(os.path.dirname(__file__), 'data', 'regression.ckpt'),
        write_meta_graph=False, write_state=False)
    print("Saved:", path)


Reference:
http://memo.sugyan.com/entry/20151124/1448292129

Guess you like

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