使用tensorflow構(gòu)建一個卷積神經(jīng)網(wǎng)絡(luò)
一、卷積神經(jīng)網(wǎng)絡(luò)
卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network,CNN)是一種前饋神經(jīng)網(wǎng)絡(luò),它的人工神經(jīng)元可以響應(yīng)一部分覆蓋范圍內(nèi)的周圍單元,對于大型圖像處理有出色表現(xiàn),主要包括卷積層(convolutional layer)和池化層(pooling layer),主要應(yīng)用于圖像、視頻、時間序列信號、音頻信號、文本數(shù)據(jù)等。
一般的卷積神經(jīng)網(wǎng)絡(luò)都是由多個卷積層組成,每個卷積層主要包括以下幾個部分:
1、圖像會通過多個不同的卷積核進行濾波,并加偏置,提取出圖像的局部特征,每一個卷積核都會映射一個新的2D圖像。
2、將前面的卷積核的濾波輸出結(jié)果,并使用非線性的激活函數(shù)進行處理。最常用的激活函數(shù)有ReLU函數(shù)以及它的變種,還有tan函數(shù),以前最常用的激活函數(shù)是sigmoid函數(shù)。
3、對激活函數(shù)的結(jié)果進行池化操作(***池化、平均池化),目的是為了達到降采樣,將2×2的圖片降為1×1。最常用的是***池化,可以保留圖像的顯著特征,并提升模型的畸變?nèi)萑棠芰?,提高模型的魯棒性?/p>
二、使用tensorflow構(gòu)建一個卷積神經(jīng)網(wǎng)絡(luò)
通過tensorflow來構(gòu)建一個卷積神經(jīng)網(wǎng)絡(luò)并將其應(yīng)用在MNIST手寫數(shù)據(jù)集上,***可以得到一個99%以上的準確率。這個模型主要包含四層:
***層:卷積層,卷積核的大小為5×5,一共包含32個卷積核,步長為1,padding為SAME使得輸出圖片的大小和輸入一致。
第二層:卷積層,卷積核的大小為5×5,一共包含64個卷積核, 步長核填充方式和上一層卷積層一樣。
第三層:全連接層,輸入7×7×64,輸出一個1024維的向量,并使用dropout使得部分節(jié)點失活來防止過擬合。
第四層:softmax層,輸入是一個1024維的向量,輸出一個10維的向量。
1、***層卷積層
***層卷積層的輸入是一個28×28×1的圖片,圖片的寬高都是28,圖片通道為1,通過卷積層之后的輸出為28×28×32,然后通過***池化,輸出為14×14×32。
2、第二層卷積層
第二層卷積層的輸入是14×14×32,通過卷積之后的輸出是14×14×64,然后通過***池化之后的輸出為7×7×64。
3、第三層全連接層
第三層的輸入是一個7×7×64的向量,所以要在計算之前對第二層卷積層的結(jié)果進行reshap操作,全連接層通過ReLU激活函數(shù)之后,再對其進行dropout操作。
4、第四層softmax層
第四層的輸入是一個1024維的向量,輸出是一個10維向量,表示屬于0-9數(shù)字的概率。
5、權(quán)重的初始化
在卷積神經(jīng)網(wǎng)絡(luò)中,權(quán)重的初始化很重要,這里我們使用的是一個截斷的正態(tài)分布函數(shù)來參數(shù)權(quán)重,并保證參數(shù)的標準差為0.1。 截斷的正態(tài)分布是指如果函數(shù)隨機產(chǎn)生的值與均值的差值大于兩倍的標準差,那這個值將會被重新生成,來保證初始化權(quán)重的值不會相差太大。
6、初始化截距
截距的值都初始化為0.1
7、卷積函數(shù)
卷積的步長為1,填充方式是SAME,來保證卷積的輸入和輸出的大小一致。
8、***池化函數(shù)
***池化的橫向和縱向的步長都為2,使得輸出圖片大小為輸入圖片大小的一半,達到降采樣的目的。
完整代碼:
https://github.com/steelOneself/tensorflow_learn/blob/88f614508081d8c3a926ea000966aa8d1ac35440/MNIST_examples/CNNMNIST.py