06.05 使用tensorflow構建一個卷積神經網絡

一、卷積神經網絡

卷積神經網絡(Convolutional Neural Network,CNN)是一種前饋神經網絡,它的人工神經元可以響應一部分覆蓋範圍內的周圍單元,對於大型圖像處理有出色表現,主要包括卷積層(convolutional layer)和池化層(pooling layer),主要應用於圖像、視頻、時間序列信號、音頻信號、文本數據等。

使用tensorflow構建一個卷積神經網絡

一般的卷積神經網絡都是由多個卷積層組成,每個卷積層主要包括以下幾個部分:

1、圖像會通過多個不同的卷積核進行濾波,並加偏置,提取出圖像的局部特徵,每一個卷積核都會映射一個新的2D圖像。

2、將前面的卷積核的濾波輸出結果,並使用非線性的激活函數進行處理。最常用的激活函數有ReLU函數以及它的變種,還有tan函數,以前最常用的激活函數是sigmoid函數。

3、對激活函數的結果進行池化操作(最大池化、平均池化),目的是為了達到降採樣,將2×2的圖片降為1×1。最常用的是最大池化,可以保留圖像的顯著特徵,並提升模型的畸變容忍能力,提高模型的魯棒性。

二、使用tensorflow構建一個卷積神經網絡

通過tensorflow來構建一個卷積神經網絡並將其應用在MNIST手寫數據集上,最後可以得到一個99%以上的準確率。這個模型主要包含四層:

第一層:卷積層,卷積核的大小為5×5,一共包含32個卷積核,步長為1,padding為SAME使得輸出圖片的大小和輸入一致。

第二層:卷積層,卷積核的大小為5×5,一共包含64個卷積核, 步長核填充方式和上一層卷積層一樣。

第三層:全連接層,輸入7×7×64,輸出一個1024維的向量,並使用dropout使得部分節點失活來防止過擬合。

第四層:softmax層,輸入是一個1024維的向量,輸出一個10維的向量。

1、第一層卷積層

第一層卷積層的輸入是一個28×28×1的圖片,圖片的寬高都是28,圖片通道為1,通過卷積層之後的輸出為28×28×32,然後通過最大池化,輸出為14×14×32。

使用tensorflow構建一個卷積神經網絡

2、第二層卷積層

第二層卷積層的輸入是14×14×32,通過卷積之後的輸出是14×14×64,然後通過最大池化之後的輸出為7×7×64。

使用tensorflow構建一個卷積神經網絡

3、第三層全連接層

第三層的輸入是一個7×7×64的向量,所以要在計算之前對第二層卷積層的結果進行reshap操作,全連接層通過ReLU激活函數之後,再對其進行dropout操作。

使用tensorflow構建一個卷積神經網絡

4、第四層softmax層

第四層的輸入是一個1024維的向量,輸出是一個10維向量,表示屬於0-9數字的概率。

使用tensorflow構建一個卷積神經網絡

5、權重的初始化

在卷積神經網絡中,權重的初始化很重要,這裡我們使用的是一個截斷的正態分佈函數來參數權重,並保證參數的標準差為0.1。 截斷的正態分佈是指如果函數隨機產生的值與均值的差值大於兩倍的標準差,那這個值將會被重新生成,來保證初始化權重的值不會相差太大。

使用tensorflow構建一個卷積神經網絡

6、初始化截距

截距的值都初始化為0.1

使用tensorflow構建一個卷積神經網絡

7、卷積函數

卷積的步長為1,填充方式是SAME,來保證卷積的輸入和輸出的大小一致。

使用tensorflow構建一個卷積神經網絡

8、最大池化函數

最大池化的橫向和縱向的步長都為2,使得輸出圖片大小為輸入圖片大小的一半,達到降採樣的目的。

使用tensorflow構建一個卷積神經網絡

完整代碼:

https://github.com/steelOneself/tensorflow_learn/blob/88f614508081d8c3a926ea000966aa8d1ac35440/MNIST_examples/CNNMNIST.py


分享到:


相關文章: