1. 程式人生 > >LSTM對MNIST資料集做分類

LSTM對MNIST資料集做分類

https://morvanzhou.github.io/tutorials/machine-learning/tensorflow/5-08-RNN2/

1.設定 RNN 的引數

RNN 從每張圖片的第一行畫素讀到最後一行, 然後再進行分類判斷.

(1)匯入 MNIST 資料並確定 RNN 的各種引數

下載地址: http://yann.lecun.com/exdb/mnist/
在這裡插入圖片描述

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
tf.set_random_seed(1)   # set random seed

# 匯入資料
mnist = input_data.read_data_sets('MNIST_data', one_hot=True)

# hyperparameters
lr = 0.001                  # learning rate
training_iters = 100000     # train step 上限
batch_size = 128
n_inputs = 28               # MNIST data input (img shape: 28*28)
n_steps = 28                # time steps
n_hidden_units = 128        # neurons in hidden layer
n_classes = 10              # MNIST classes (0-9 digits)

(2)定義 x, y 的 placeholder 和 weights, biases 的初始狀況

x = tf.placeholder(tf.float32, [None, n_steps, n_inputs])
y = tf.placeholder(tf.float32, [None, n_classes])

weights = {
    # shape (28, 128)
    'in': tf.Variable(tf.random_normal([n_inputs, n_hidden_units])),
    # shape (128, 10)
    'out': tf.Variable(tf.random_normal([n_hidden_units, n_classes]))
        }
biases = {
    # shape (128, )
    'in': tf.Variable(tf.constant(0.1, shape=[n_hidden_units, ])),
    # shape (10, )
    'out': tf.Variable(tf.constant(0.1, shape=[n_classes, ]))
        }

2.定義 RNN 的主體結構

RNN 總共有 3 個組成部分 ( input_layer, cell, output_layer)

 # (1)input_layer
def RNN(X, weights, biases):
    # 原始的 X 是 3 維資料, 我們需要把它變成 2 維資料才能使用 weights 的矩陣乘法
    # X ==> (128 batches * 28 steps, 28 inputs)
    X = tf.reshape(X, [-1, n_inputs])

    # X_in = W*X + b
    X_in = tf.matmul(X, weights['in']) + biases['in']
    # X_in ==> (128 batches, 28 steps, 128 hidden) 換回3維
    X_in = tf.reshape(X_in, [-1, n_steps, n_hidden_units])

    # (2)cell
    # 使用 basic LSTM Cell.
    lstm_cell = tf.nn.rnn_cell.BasicLSTMCell(n_hidden_units, forget_bias=1.0, state_is_tuple=True)
    init_state = lstm_cell.zero_state(batch_size, dtype=tf.float32) # 初始化全零 state

    # (3)output_layer
    outputs, states = tf.nn.dynamic_rnn(lstm_cell, X_in, initial_state=init_state, time_major=False)
    results = tf.matmul(states[1], weights['out']) + biases['out']
    return results

3.計算 cost 和 train_op

pred = RNN(x, weights, biases)
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=pred, labels=y))
train_op = tf.train.AdamOptimizer(lr).minimize(cost)

4.訓練 RNN

correct_pred = tf.equal(tf.argmax(pred, 1), tf.argmax(y, 1))
accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))
init = tf.initialize_all_variables()

with tf.Session() as sess:
    sess.run(init)
    step = 0
    while step * batch_size < training_iters:
        batch_xs, batch_ys = mnist.train.next_batch(batch_size)
        batch_xs = batch_xs.reshape([batch_size, n_steps, n_inputs])
        sess.run([train_op], feed_dict={
            x: batch_xs,
            y: batch_ys,
        })
        if step % 20 == 0:
            print(sess.run(accuracy, feed_dict={
            x: batch_xs,
            y: batch_ys,
        }))
        step += 1

5.結果展示

0.265625
0.7265625
0.828125
0.8828125
0.84375
0.859375
0.8984375
0.890625
0.84375
0.90625
0.921875
0.90625
0.9140625
0.9140625
0.9375
0.9609375
0.953125
0.921875
0.9453125
0.96875
0.9375
0.9609375
0.890625
0.984375
0.953125
0.953125
0.9453125
0.9453125
0.96875
0.9375
0.953125
0.96875
0.9375
0.9921875
0.9609375
0.9609375
0.953125
0.9609375
0.96875
0.96875

Process finished with exit code 0

視訊詳細教學: https://www.bilibili.com/video/av16001891/?p=33