載入MNIST數據集。創建預設Interactive Session。 初始化函數,權重製造隨機雜訊打破完全對稱。截斷正態分佈雜訊,標準差設0.1。ReLU,偏置加小正值(0.1),避免死亡節點(dead neurons)。 捲積層函數,tf.nn.conv2d,TensorFlow 2 維捲積函數 ...
載入MNIST數據集。創建預設Interactive Session。
初始化函數,權重製造隨機雜訊打破完全對稱。截斷正態分佈雜訊,標準差設0.1。ReLU,偏置加小正值(0.1),避免死亡節點(dead neurons)。
捲積層函數,tf.nn.conv2d,TensorFlow 2 維捲積函數,參數x輸入,W捲積參數,捲積核尺寸,channel個數,捲積核數量(捲積層提取特征數量)。Strides捲積模板移動步長,全1代表不遺漏划過圖片每一個點。Padding代表邊界處理方式,SAME邊界加Padding,捲積輸出、輸入保持同樣尺寸。
池化層函數,tf.nn.max_pool,TensorFlow 最大池化函數。2x2最大池化,2x2像素塊降為1x1像素。最大池化保留原始像素塊灰度值最高像素,保留最顯著特征。strides設橫豎方向2步長。
定義輸入placeholder,x特征,y真實label。捲積神經網路空間結構信息,1D輸入向量,轉為2D圖片結構。尺寸[-1,28,28,1]。-1代表樣本數量不固定。1代表顏色通道數量。tf.reshape tensor變形函數。
第一個捲積層,捲積函數初始化,weights、bias。[5,5,1,32]代表捲積核尺寸5x5,1個顏色通道,32個不同捲積核。使用conv2d函數捲積操作,加偏置,使用ReLU激活函數非線性處理。使用最大池化函數max_pool_2x2池化操作捲積輸出結果。
第二個捲積層,捲積核64個,提取64種特征。經歷兩次步長2x2最大池化,邊長只有1/4,圖片尺寸28x28變7x7.第二個捲積層捲積核數量64,輸出tensor尺寸7x7x64。使用tf.reshape函數對第二個捲積層輸出tensor變形,轉成1D向量,連接一個全連接層,隱含節點1024,使用ReLU激活函數。
使用Dropout層減輕過擬合。Dropout,通過一個placeholder傳入keep_prob比率控制。訓練時,隨機丟棄部分節點數據減輕過擬合,預測時保留全部數據追求最好預測性能。
Dropout層輸出連接Softmax層,得到最後概率輸出。
定義損失函數cross_entropy。優化器使用Adam,給予較小學習速率1e-4。
定義評測準確率操作。
訓練,初始化所有參數,設置訓練時Dropout的keep_prob比率0.5.使用大小50的mini-batch,進行20000次訓練迭代,樣本數量100萬。每100次訓練,評測準確率,keep_prob設1,實時監測模型性能。
全部訓練完成,測試集全面測試,得到整體分類準確率。
99.2%準確率,捲積網路對圖像特征提取抽象,捲積核權值共用。
from tensorflow.examples.tutorials.mnist import input_data import tensorflow as tf mnist = input_data.read_data_sets("MNIST_data/", one_hot=True) sess = tf.InteractiveSession() 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) 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') x = tf.placeholder(tf.float32, [None, 784]) y_ = tf.placeholder(tf.float32, [None, 10]) 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) 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) 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) keep_prob = tf.placeholder(tf.float32) h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob) W_fc2 = weight_variable([1024, 10]) b_fc2 = bias_variable([10]) y_conv=tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2) cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y_conv), reduction_indices=[1])) train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy) correct_prediction = tf.equal(tf.argmax(y_conv,1), tf.argmax(y_,1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) tf.global_variables_initializer().run() for i in range(20000): batch = mnist.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)) train_step.run(feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5}) print("test accuracy %g"%accuracy.eval(feed_dict={ x: mnist.test.images, y_: mnist.test.labels, keep_prob: 1.0}))
參考資料:
《TensorFlow實踐》
歡迎付費咨詢(150元每小時),我的微信:qingxingfengzi