MNIST全連接網絡識別代碼(二)

兩層的全連接神經網絡實現手寫數字識別

1. 導入包並創建默認的InteractiveSession

下面這段代碼在上一篇中有詳細註釋https://mp.csdn.net/mdeditor/85038605#

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

2. 構建模型

2.1 網絡結構

網絡包括輸入層,隱藏層和輸出層三層,隱藏層用了Dropout方法防止過擬合

in_units = 784//輸入層節點
hl_units = 300//隱藏層節點

W1 = tf.Variable(tf.truncated_normal([in_units, h1_units], stddev=0.1))//設置輸入層到隱藏層的權重,
//truncated_normal(shape,mean,stddev)
//截斷正態分佈。用於產生正態分佈,mean均值和stddev標準差由自己設置。此函數產生的隨機數與均值的差距不會超過
//兩倍的標準差,由於下面使用的ReLUctant函數,用正太分佈給參數加一些噪聲,來打破完全對稱並且避免0梯度。
b1 = tf.Variable(tf.zeros([h1_units]))//設置輸入層到隱藏層的偏置

W2 = tf.Variable(tf.zeros([h1_units, 10]))//設置隱藏層到輸出層的權重,上一層是h1_units個節點,下一層是10個節點
b2 = tf.Variable(tf.zeros([10]))//設置隱藏層到輸出層的偏置

x = tf.placeholder(tf.float32, [None, in_units])//設置存放輸入變量的placeholder
keep_prob = tf.placeholder(tf.float32)//Dropout方法中用來設置保留節點的概率值

hidden1 = tf.nn.relu(tf.matmul(x, W1)+b1)//輸入層到隱藏層的激活函數用ReLU函數
hidden1_drop = tf.nn.dropout(hidden1, keep_prob)//Dropout方法用於防止過擬合。隱藏層某些神經元按照Dropout的概率隨機置爲0,keep_prob的值爲不置爲0的比例,應小於1。

y = tf.nn.softmax(tf.matmul(hidden1_drop, W2)+b2)//y爲網絡結構得出的輸出,採用softmax多分類器對數字進行分類
y_ = tf.placeholder(tf.float32, [None, 10])//y_爲實際的標籤

2.2 學習方式和評價指標(損失函數、優化器和準確率)

cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))
train_step = tf.train.AdagradOptimizer(0.3).minimize(cross_entropy)//用Adagrad來優化,學習率定在0.3比較好。也可以用SGD、Adadelta、RMSprop、Adam等優化器。SGD、Adadelta優化器一般比較好的學習率是0.6,RMSprop、Adam優化器一般比較好的學習率是1e-4。
train_step = tf.train.AdagradOptimizer(0.3).minimize(cross_entropy)//訓練方式,以0.3的學習率在優化器中學習,找到最小的損失。
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))//真實值和預測值之間的比較,結果是一個一維的布爾矩陣
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))//準確率

3. 訓練

tf.global_variables_initializer().run()//訓練前的準備,初始化所有的參數
// 訓練
for i in range(3000):// 訓練3000// 獲取100條數據作爲一個batch
    batch_xs, batch_ys = mnist.train.next_batch(100)//這裏有個疑問,就是train.next_batch是隨機獲取指定數量的數據還是按順序的去獲取制定數量的數據,已經訓練過的數據會不會重複訓練,望看到的大神給解答下,謝謝了。
    // 訓練,這裏的Dropout的設置爲0.75  
    train_step.run({x: batch_xs, y_: batch_ys, keep_prob: 0.75})
    //100個batch的訓練做一個預測
    if i % 100 == 0:
        # 輸出準確率,這裏的Dropout的設置爲1
        print("Step %d" % (i))
        print("Train accuracy:", accuracy.eval({x: batch_xs, y_: batch_ys, keep_prob: 0.75}))//訓練的準確率
        print("Test accuracy:", accuracy.eval({x: mnist.test.images, y_: mnist.test.labels, keep_prob: 1.0}))//預測的準確率

PS: 初學圖像處理,還是小白,大家有問題多多交流。文中代碼借鑑部分參考資料,有問題還請指正,十分感謝!本週感想:作爲計算機的程序媛,其實很討厭代碼,但是對於python這個語言感覺還是很神奇的,加之畢業需要,迫使自己研究深度學習,不得不學這個代碼,願每一個在計算機坑裏面的人,都能努力爬出坑。O(∩_∩)O哈哈~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章