CNN - 分類器

1. CNN - 分類器

實現對mnist數據集圖片進行識別分類

## 2019.11.1 ## 使用mnist數據集, 訓練一個CNN分類器 ## mnist: x: [-1, 28, 28, 1] y: [-1, 10] import numpy as np import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data import matplotlib.pyplot as plt mnist = input_data.read_data_sets('MNIST_data', one_hot=True) def weight_variable(shape): ## tf.truncated_normal 產生正態分佈數據, mean-2std , mean+2std weight = tf.truncated_normal(shape, stddev=0.1) return tf.Variable(weight) def bais_variable(shape): bais = tf.constant(0.1, shape=shape) return tf.Variable(bais) 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='VALID') def compute_accuracy(v_xs, v_ys): global predict y_pre = sess.run(predict, feed_dict={xs: v_xs}) correct_prediction = tf.equal(tf.argmax(y_pre,1), tf.argmax(v_ys,1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) result = sess.run(accuracy, feed_dict={xs: v_xs, ys: v_ys, keep_prob: 0.5}) print("accuary: {:.3f}".format(result)) xs = tf.placeholder(tf.float32, shape=[None, 28*28]) / 255 ys = tf.placeholder(tf.float32, shape=[None, 10]) keep_prob = tf.placeholder(tf.float32) x_image = tf.reshape(xs, [-1, 28, 28, 1]) ##1 卷積層 池化層 w_conv1 = weight_variable([5, 5, 1, 32]) b_conv1 = bais_variable([32]) h_conv1 = tf.nn.relu(conv2d(x_image, w_conv1) + b_conv1) ## 28*28*32 h_pool1 = max_pool_2X2(h_conv1) ## 14*14*32 ##2 卷積層 池化層 w_conv2 = weight_variable([5, 5, 32, 64]) b_conv2 = bais_variable([64]) h_conv2 = tf.nn.relu(conv2d(h_pool1, w_conv2) + b_conv2) ## 14*14*64 h_pool2 = max_pool_2X2(h_conv2) ## 7*7*64 ## 將數據平滑, 用於全連接 h_pool2_flat = tf.reshape(h_pool2, [-1, 7*7*64]) ## 全連接 w_fc1 = weight_variable([7*7*64, 1024]) b_fc1 = bais_variable([1024]) h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, w_fc1) + b_fc1) ## dropout keep_prob: 保存的可能性 h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob) ## softmax層 w_fc2 = weight_variable([1024, 10]) b_fc2 = bais_variable([10]) predict = tf.nn.softmax(tf.matmul(h_fc1, w_fc2) + b_fc2) ## 選用交叉熵函數。交叉熵用來衡量預測值和真實值的相似程度,如果完全相同,它們的交叉熵等於零。 cross_entropy = tf.reduce_mean(-tf.reduce_sum(ys*tf.log(predict), reduction_indices=1)) train = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy) loss = [] with tf.Session() as sess: sess.run(tf.global_variables_initializer()) for i in range(1000): batch_xs, batch_ys = mnist.train.next_batch(100) sess.run(train, feed_dict={xs:batch_xs, ys:batch_ys, keep_prob:0.5}) loss.append(sess.run(cross_entropy, feed_dict={xs:batch_xs, ys:batch_ys, keep_prob:0.5})) if i % 100 == 0: compute_accuracy(mnist.test.images[:1000,:], mnist.test.labels[:1000,:]) plt.plot(list(np.linspace(0, 1000, 1000)), loss, c='red', lw=1) plt.show()

accuary: 0.071

accuary: 0.851

accuary: 0.903

accuary: 0.925

accuary: 0.946

accuary: 0.955

accuary: 0.959

accuary: 0.963

accuary: 0.965

accuary: 0.971