tensorflow搭建卷積神經(jīng)網(wǎng)絡

"""

最終測試集結果0.9912

test accuracy 0.9912

"""

]import tensorflow as tf

from tensorflow.examples.tutorials.mnistimport input_data

def weight_variable(shape):? # 產(chǎn)生正態(tài)分布的卷積核權重,若生成的值與均值的差值大于兩倍的標準差,就重新生成

? ? initial= tf.truncated_normal(shape,stddev=0.1)

? ? return tf.Variable(initial)

def bias_variable(shape):? # 產(chǎn)生偏差矩陣

? ? initial= tf.constant(0.1,shape=shape)

? ? return tf.Variable(initial)

def conv2d(x, W):? # 卷積函數(shù)

? ? return tf.nn.conv2d(x, W,strides=[1,1,1,1],padding='SAME')? # 步長strides決定卷積的步伐,padding決定是否丟棄一部分,VALID丟棄,SAME不丟棄,不足之處補0

def max_pool_2x2(x):? # 池化函數(shù)

? ? return tf.nn.max_pool(x,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')

mnist= input_data.read_data_sets("MNIST_data/",one_hot=True)? # 下載或讀取數(shù)據(jù)集,one_hot編碼

x= tf.placeholder(tf.float32,[None,784])? # n行784列的輸入矩陣

W= tf.Variable(tf.zeros([784,10]))? # 權重矩陣,784行10列,初始化為零

b= tf.Variable(tf.zeros([10]))? # 偏置矩陣,10列的一個array

y_= tf.placeholder("float",[None,10])? # 訓練集的標簽

# 第一層卷積池化(采樣)得到14*14*32

W_conv1= weight_variable([5,5,1,32])

b_conv1= bias_variable([32])

x_image= tf.reshape(x,[-1,28,28,1])

h_conv1= tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)? # 首先是卷積加上偏置,卷積后再使用激活函數(shù)進行映射(實際是卷積層每個feature maps上的神經(jīng)元陣列進行卷積、映射)

h_pool1= max_pool_2x2(h_conv1)? # 實際上是進行采樣,減小數(shù)據(jù)量,提取主要特征

# 第二層卷積池化(采樣)得到7*7*64

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)

# 全連接層將7*7*64展開

W_fc1= weight_variable([7 * 7 * 64,1024])? # 7*7*64個輸入,1024個神經(jīng)元

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)

# Dropout,減少過擬合

keep_prob= tf.placeholder('float')

h_fc1_drop= tf.nn.dropout(h_fc1, keep_prob)? # 一般用在全連接層,其含義是指,以keep_prob概率變?yōu)樵瓉淼?/keep_prob,以keep_prob概率變?yōu)?

# 輸出層,輸出到10個神經(jīng)元,構造softmax regression

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_sum(y_*tf.log(y_conv))? # 計算交叉熵,用來衡量模型好壞

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,"float"))? # argmax當axis=0時返回每一列的最大值的位置索引,當axis=1時返回每一行中的最大值的位置索引

sess= tf.InteractiveSession()? # 交互式環(huán)境比Session更加靈活

sess.run(tf.global_variables_initializer())

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

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

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容