卷積神經網路之tensorflow實現
阿新 • • 發佈:2019-02-06
tensorflow中集成了很多庫和函式,卷積神經網路的實現變得十分簡單,這節講述如何利用tensorflow實現一個兩個卷積層的神經網路,用於對手寫數字的識別。
程式碼如下:
# -*- coding:utf-8 -*- #功能:使用卷積神經網路實現對手寫數字的識別 import tensorflow as tf import tensorflow.examples.tutorials.mnist.input_data as input_data #新建權重函式和偏置函式 def weight_variable(shape): initial=tf.random_normal(shape,mean=0.0,stddev=0.01) return tf.Variable(initial) def bias_variable(shape): initial=tf.random_normal(shape,mean=0.0,stddev=0.01) return tf.Variable(initial) #新建輸入輸出有關的佔位符 mnist=input_data.read_data_sets('MNIST_data/',one_hot=True) x=tf.placeholder(tf.float32,[None,784]) y=tf.placeholder(tf.float32,[None,10]) #構造兩層卷積神經網路 #把資料維度變為4-D,即(batch_size,width,height,channel) #bacth_size=-1的意思是這個維度只用總維度除以width*height*channel x_tensor=tf.reshape(x,[-1,28,28,1]) #設定第一個卷積層感知區域的大小 filter_size=3 n_filter_1=16 w_conv1=weight_variable([filter_size,filter_size,1,n_filter_1]) b_conv1=bias_variable([n_filter_1]) #第一次卷積後的結果 引數'SAME'滿足了卷積前和卷積後的資料維度一致 #elu為啟用函式 h_conv1=tf.nn.elu(tf.nn.conv2d(input=x_tensor,filter=w_conv1,strides=[1,2,2,1],padding='SAME')+b_conv1) #第二個卷積核的 n_filter_2=16 #個數 w_conv2=weight_variable([filter_size,filter_size,n_filter_1,n_filter_2]) b_conv2=bias_variable([n_filter_2]) #第二個卷積之後的結果 h_conv2=tf.nn.elu(tf.nn.conv2d(input=h_conv1,filter=w_conv2,strides=[1,2,2,1],padding='SAME')+b_conv2) #新增全連線隱層 #由卷積層過度到隱含層,需要對卷積層的輸出做一個維度變換 h_conv2_flat=tf.reshape(h_conv2,[-1,7*7*n_filter_2]) #創造一個全連線層,隱含神經元的個數為1024 n_fc=1024 w_fc1=weight_variable([7*7*n_filter_2,n_fc]) b_fc1=bias_variable([n_fc]) #全連線之後的輸出層 h_fc1=tf.nn.elu(tf.matmul(h_conv2_flat,w_fc1)+b_fc1) #新增dropout 防止過擬合 keep_prob=tf.placeholder(tf.float32) h_fc1_drop=tf.nn.dropout(h_fc1,keep_prob) #新增softmax層 w_fc2=weight_variable([n_fc,10]) b_fc2=bias_variable([10]) y_pred=tf.nn.softmax(tf.matmul(h_fc1_drop,w_fc2)+b_fc2) #獲取目標函式 cross_entropy=-tf.reduce_sum(y*tf.log(y_pred)) optimizer=tf.train.AdamOptimizer().minimize(cross_entropy) #計算分類準確率 correct_prediction=tf.equal(tf.argmax(y_pred,1),tf.argmax(y,1)) accuracy=tf.reduce_mean(tf.cast(correct_prediction,'float')) #新建會話 並進行mini_batch訓練 sess=tf.Session() sess.run(tf.initialize_all_variables()) #使用mini_batch來訓練 batch_size=100 #訓練5輪 n_epoch=5 for epoch_i in range(n_epoch): #每一輪都是對一個batch_size進行訓練 for batch_i in range(mnist.train.num_examples//batch_size): batch_xs,batch_ys=mnist.train.next_batch(batch_size) sess.run(optimizer,feed_dict={x:batch_xs,y:batch_ys,keep_prob:0.5}) #對所有mini_batch執行完一輪以後 列印準確率結果 print (sess.run(accuracy,feed_dict={x:mnist.validation.images,y:mnist.validation.labels,keep_prob:0.5}))