深度學習——手寫數字識別——卷積神經網絡

卷積神經網絡

這裏使用了卷積神經網絡,在上一個的基礎上加入了卷積核,這樣可以提到效果的準確性,但相應的加長了代碼運行的時長,
運用3個卷積核可以將準確率提高到99.41%

代碼實現

import tensorflow as tf
import random
from tensorflow.examples.tutorials.mnist import input_data
import matplotlib.pyplot as plt

tf.set_random_seed(1)

mnist = input_data.read_data_sets('MNIST_data/', one_hot=True)

lerning_rate = 0.001
training_times = 15
batch_size = 100

# 佔位符
keep_prob = tf.placeholder(tf.float32)

X = tf.placeholder(tf.float32, [None, 784])
Y = tf.placeholder(tf.float32, [None, 10])
X_img = tf.reshape(X, [-1, 28, 28, 1])

# 初始化W(W爲卷積核)
W1 = tf.Variable(tf.random_normal([3, 3, 1, 32], stddev=0.01))
W2 = tf.Variable(tf.random_normal([3, 3, 32, 64], stddev=0.01))
W3 = tf.Variable(tf.random_normal([3, 3, 64, 128], stddev=0.01))

# 卷積部分
L1 = tf.nn.conv2d(X_img, W1, strides=[1, 1, 1, 1], padding='SAME')
L1 = tf.nn.relu(L1)
L1 = tf.nn.max_pool(L1, ksize=[1, 2, 2, 1],
                    strides=[1, 2, 2, 1], padding='SAME')
L1 = tf.nn.dropout(L1, keep_prob=keep_prob)

L2 = tf.nn.conv2d(L1, W2, strides=[1, 1, 1, 1], padding='SAME')
L2 = tf.nn.relu(L2)
L2 = tf.nn.max_pool(L2, ksize=[1, 2, 2, 1],
                    strides=[1, 2, 2, 1], padding='SAME')
L2 = tf.nn.dropout(L2, keep_prob=keep_prob)

L3 = tf.nn.conv2d(L2, W3, strides=[1, 1, 1, 1], padding='SAME')
L3 = tf.nn.relu(L3)
L3 = tf.nn.max_pool(L3, ksize=[1, 2, 2, 1],
                    strides=[1, 2, 2, 1], padding='SAME')
L3 = tf.nn.dropout(L3, keep_prob=keep_prob)
# 一張圖片壓成一行
L3_flat = tf.reshape(L3, [-1, 128 * 4 * 4])

# 全連接部分
W4 = tf.get_variable('W4', shape=[128 * 4 * 4, 625],
                     initializer=tf.contrib.layers.xavier_initializer())
b4 = tf.Variable(tf.random_normal([625]))
L4 = tf.nn.relu(tf.matmul(L3_flat, W4) + b4)
L4 = tf.nn.dropout(L4, keep_prob)

W5 = tf.get_variable('W5', shape=[625, 10],
                     initializer=tf.contrib.layers.xavier_initializer())
b5 = tf.Variable(tf.random_normal([10]))
L5 = tf.matmul(L4, W5) + b5

cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(
    logits=L5, labels=Y
))
op = tf.train.AdamOptimizer(lerning_rate).minimize(cost)

sess = tf.Session()
sess.run(tf.global_variables_initializer())

for times in range(training_times):
    avg_cost = 0
    n_batch = int(mnist.train.num_examples / batch_size)
    for i in range(n_batch):
        train_X, train_Y = mnist.train.next_batch(batch_size)
        c, _ = sess.run([cost, op], feed_dict={X: train_X, Y: train_Y, keep_prob: 0.7})
        avg_cost += c / n_batch

    print('次數', times + 1, '代價', avg_cost)

correct_prediction = tf.equal(tf.argmax(L5, 1), tf.argmax(Y, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
print('Accuracy', sess.run(accuracy, feed_dict={X: mnist.test.images, Y: mnist.test.labels, keep_prob: 1}))

r = random.randint(0, mnist.test.num_examples - 1)
print('Label:', sess.run((tf.argmax(mnist.test.labels[r:r + 1], 1))))
print('Prediction:', sess.run(tf.argmax(L5, 1), feed_dict={X: mnist.test.images[r:r + 1], keep_prob: 1}))

plt.imshow(mnist.test.images[r:r + 1].
           reshape(28, 28), cmap='Greys', interpolation='nearest')
plt.show()

效果展示

次數 1 代價 0.4498650217462668
次數 2 代價 0.09336521413515922
次數 3 代價 0.06857394713315777
次數 4 代價 0.05958020700395779
次數 5 代價 0.04760033970656381
次數 6 代價 0.04463218545837499
次數 7 代價 0.041744226679121185
次數 8 代價 0.03714639837091621
次數 9 代價 0.0343767316456334
次數 10 代價 0.03308235507437282
次數 11 代價 0.0311410283320054
次數 12 代價 0.027866876660528655
次數 13 代價 0.028156194471097976
次數 14 代價 0.02689577491107312
次數 15 代價 0.026222677102883955
Accuracy 0.9941
Label: [8]
Prediction: [8]

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章