tensorflow cnn minist
阿新 • • 發佈:2018-11-07
在mnist資料集上用tensorflow搭建CNN模型
import tensorflow as tf import numpy as np from tensorflow.examples.tutorials.mnist import input_data import warnings warnings.filterwarnings("ignore") mnist = input_data.read_data_sets('mnist_data', one_hot=True) input_x = tf.placeholder(tf.float32, [None, 28*28])/255 output_y = tf.placeholder(tf.int32, [None, 10]) # 10個數字的標籤 input_x_images = tf.reshape(input_x, [-1, 28, 28, 1]) test_x = mnist.test.images[:3000] test_y = mnist.test.labels[:3000] print(mnist.train.images.shape) # 可以檢視資料大小 print(mnist.test.images.shape) # 第一層卷積, 輸出形狀程式設計[-1, 28, 28, 32] conv1 = tf.layers.conv2d( inputs=input_x_images, filters=32, # 32個過濾器 kernel_size=[5, 5], # 過濾器在二維的大小 strides=1, # 步長為1 padding='same', # same表示輸出大小不變,因此需要在外圍補0(兩圈) activation=tf.nn.relu # 啟用函式 ) # 池化層(亞取樣),主要是採取部分資料,步長為2,經過亞取樣後變為[-1,14, 14, 32] # pooling:max_pooling和average_pooling兩種 pool1 = tf.layers.max_pooling2d( inputs=conv1, pool_size=[2, 2], # 亞取樣,在2*2中取出一個最大值 strides=2 # 步長為2 ) # 第二層卷積, 輸出大小為[-1,14, 14, 64] conv2 = tf.layers.conv2d( inputs=pool1, filters=64, # 64個過濾器 kernel_size=[5, 5], # 過濾器在二維的大小 strides=1, # 步長為1 padding='same', # same表示輸出大小不變,因此需要在外圍補0(兩圈) activation=tf.nn.relu # 啟用函式 ) # 第二層池化, 輸出大小為[-1,7, 7, 64] pool2 = tf.layers.max_pooling2d( inputs=conv2, pool_size=[2, 2], # 亞取樣,在2*2中取出一個最大值 strides=2 # 步長為2 ) # 平坦化 flat = tf.reshape(pool2, [-1, 7*7*64]) # 把資料鋪平,每張圖片變成一個7*7*64大小的行向量 # 全連線層,1024個神經元 dense = tf.layers.dense( inputs=flat, units=1024, # 1024個神經元 activation="relu" ) # dropout:丟棄部分資料,rate即為丟棄資料的百分比 dropout = tf.layers.dropout( inputs=dense, rate=0.5, # r即為丟棄資料的百分比 training=True ) # 10個神經元的全連線層,這裡不用啟用函式來做非線性化了 logits = tf.layers.dense( inputs=dropout, units=10 ) # 計算誤差(cross entropy, 再用softmax計算百分比)softmax是一種啟用函式 loss = tf.losses.softmax_cross_entropy( onehot_labels=output_y, # 真實標籤 logits=logits # 神經網路的預估 ) # 用優化器來最小化誤差 train_op = tf.train.AdamOptimizer(learning_rate=0.001).minimize(loss) # 計算預測值和標籤的正確率 accuracy = tf.metrics.accuracy( labels=tf.argmax(output_y, axis=1), # axis=1表示按行最大值, axis=0表示按列最大值 predictions=tf.argmax(logits, axis=1) )[1] # 建立會話 sess = tf.Session() # 初始化變數 init = tf.group(tf.global_variables_initializer(), tf.local_variables_initializer()) sess.run(init) for i in range(20000): batch = mnist.train.next_batch(50) # 從train訓練集裡取50個樣本 train_loss, train_op_ = sess.run([loss, train_op], feed_dict={input_x: batch[0], output_y: batch[1]}) if i%100==0: test_accuracy = sess.run(accuracy, {input_x:test_x, output_y:test_y}) print("Step=%d, Train loss=%.4f, Test accuracy=%.4f"%(i, train_loss, test_accuracy))
訓練結果: