白話TensorFlow +實戰系列(二)從零構建傳統神經網路
這次主要用TensorFlow從頭構建一個傳統神經網路作為案例,並總結需要注意的地方
創建一個神經網路主要有一下4個步驟:
1.定義神經網路的結構,即計算圖
2.定義損失函數
3.在會話中,將數據輸入進構建的神經網路中,反覆優化損失函數,直至得到最優解
4.將測試集丟入訓練好的神經網路進行驗證
假設我們創建一個只有兩個隱藏層的神經網路
先來看第一步:構建神經網路結構
一般在構建神經網路的初始,會先定義好超參數。參數與超參數是不一樣的!參數指的是神經元進行計算時用到的權重(W)和偏置(b),而超參數一般指的是如學習率(learning_rate),一次性輸入數據的個數(batch_size),遍歷總數(epoch)等。
定義超參數如下:
learning_rate:用於控制梯度下降的幅度
batch_size:一次性輸入數據個數
epoch_size:遍歷總數
display_step:列印中間結果的步數
然後我們定義輸入層、隱藏層、輸出層神經元,如圖
x:輸入層。tf.placeholder函數在TensorFlow中可理解為佔位用的,因為輸入的數據在每次循環中都不一樣,為了避免每次循環都要定義一個輸入,可以用該函數存儲當前循環的數據。float定義了數據類型, [None, 20]表示x的維度,其中None代表該數暫時不確定,其實這個None與batch_size的數據相對應,x可理解為一次性輸入batch_size個數據,而每個數據有20個特徵向量組成,即輸入層有20個神經元。
y:輸出層。因為有None個數據輸入,所以輸出也為None。5代表進行5分類
layer1、layer2代表隱藏層神經元個數
接著定義神經網路參數w、b
w中,h1代表的是輸入層到第一層隱藏層的權重,因為輸入層有20個神經元,隱藏層神經元個數為layer1,所以維度為[20,layer1]。h2同理。out表示第二層隱藏層到輸出層的權重。
b同理。
其中tf.Variable是用來定義變數的函數,tf.random_normal是隨機生成正太分布函數。
然後定義神經網路函數,如下:
其中,tf.nn.relu是非線性激勵函數,常用的還有tf.sigmoid、tf.tanh
tf.matmul是矩陣相乘
output就是最後的輸出。
至此,第一部分就已完成。
第二部分:定義損失函數
因為我們假設的是一個分類問題,將數據分成5類,正確的標籤第一類可由[1,0,0,0,0]代表,第二類可由[0,1,0,0,0],因此輸出層需要5個神經元來代表分成的5類。實際輸出層的輸出可能是[0.1,0.1, 0.6, 0.1, 0.1],因為與[0,0,1,0,0]最相近,我們可判定它屬於第三類。
需要注意的是,在分類問題中,神經網路的輸出層輸出的數據需要經過一層額外的處理,叫做softmax層,softmax層的作用是將輸出層的數據全部壓縮至0~1之間,並且所有和等於1。這就可以理解成將輸出層的數據變成概率分布的形式。然後就可以用交叉熵函數定義損失函數了。
TensorFlow中的tf.nn.softmax_cross_entropy_with_logits損失函數集成了上面所說的步驟,即先經過softmax層然後使用交叉熵就算損失。
由此,定義損失函數如下:
其中pred為預測的數據,即神經網路的輸出
cost即損失函數,tf.reduce_mean是求平均損失,因為一次性輸入的是多個(batch_size個)數據。
tf.train.AdamOptimizer是選擇的優化器,其作用是最小化cost
init為初始化變數
至此,第二部分也已經完成
第三部分:創建會話,執行神經網路
首先進行初始化sess.run(init)
接著遍歷epoch_step次所有數據,avg_cost用來記錄一個epoch里所損失平均,注意cost是一個batch_size里的平均損失,兩次平均不一樣。total_batch表示batch_size的個數。
然後遍歷每一個batch_size,x_batch與y_batch表示輸入數據與對應的標籤。
執行optimizer與cost,因為之前定義的x與y是用的佔位符tf.placeholder,這裡就要用feed_dict進行數據餵養。
epoch% display_step表示每display_step次數的epoch進行列印avg_cost
至此第三部分完成。
第四部分:將測試集丟入訓練好的神經網路進行驗證
首先在定義cost下面定義準確率的演算法,如下
其中correct_pred代表預測正確的標籤
tf.argmax函數返回的是張量在某一維最大值的索引值,由於標籤向量是由0,1組成,因此最大值1所在的索引位置就是類別標籤。如果pred的最大值所在的索引值等於類別標籤的索引值,表示這個結果分類正確
tf.equal是TensorFlow中判斷兩個張量是否相等,返回的是一個布爾型張量,如[True,False,False]。
因為corret_pred是一個布爾型張量,因此需要用tf.cast()函數轉化成float型來計算準確率,如[True,False,False,False]會變成[1,0,0,0],經過reduce_mean取平均值0.25來表示準確率。
最後列印準確率,為測試訓練集的結果,如下:
feed_dict的是test_x與test_y
至此,一個完整的傳統神經網路構建完成
完整代碼如下:
首發博客地址
推薦閱讀:
※什麼是創造力,AI可以獲得嗎?
※為什麼說雲計算、大數據、機器學習、深度學習被並稱為當今計算機界四大俗?
※為什麼目前的特徵學習演算法都是無監督的?
※有哪些深度學習框架可以跑在超算集群上?
※有沒有介紹神經網路、蟻群、遺傳、退火、魚群等等演算法的書籍?
TAG:深度学习DeepLearning | TensorFlow |