1. 程式人生 > >卷積神經網路之tensorflow實現

卷積神經網路之tensorflow實現

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}))