前言:
在全連接網絡中,待優化的參數過多,全連接NN:每個神經元都與前後相鄰層的每一個神經元相連接,輸入爲特徵值,輸出爲預測的結果,因此參數個數數量龐大,網絡參數的計算公式:
參數個數:
例如:對於一張28*28低像素的圖片來說,輸入節點爲784,中間層有500個節點,輸出層有10個節點,那麼第一層參數爲:784*500個w+500個b,第二層參數爲,一共397510個優化的參數,數量龐大,不利於建模與計算。
待優化的參數過多會容易造成參數的過擬合。這就需要一個簡化參數量的方法,在實際應用中,先對原始圖像進行特徵提取,將提取到的特徵餵給全連接網絡。
定義:
卷積就是特徵提取的一種方法:
一般用一個正方形的卷積核,保證正方形的中心遍歷圖片上的每一個像素點,圖片區域內,相對應的(每一個像素點的像素值)乘以(卷積核內相對應點的權重),求和之後在加上偏置。
原圖5*5的圖像,經過卷積覈計算爲:
輸出圖片邊長=(輸入圖片邊長-卷積核長+1)/步長。在上圖中:得到(5-3+1)/1=3
另外爲保證原始圖片特徵的最佳提取,邊緣的數據更好的保留,可以在外邊一層加入池化層padding,在全零填充中,輸出圖片的尺寸爲:輸入圖片邊長/步長;
在TensorFlow框架中,用參數padding=‘ SAME ’或padding=‘ VALID ’表示。
tf.nn.conv2d(輸入描述,eg.[batch,5,5,1] #分辨率5*5,通道數爲1
卷積核描述,eg.[3,3,1,16] #行列數:3*3,通道數爲1,核個數爲16,卷積圖片操作之後,輸出是16通道
核滑動步長,eg.[1,1,1,1] #行步長,列步長,固定第一個和第四個參數爲1.
padding=' VALID ')
池化(Pooling)
池化用於減少特徵數量,簡化輸入圖片。常用的池化方法有:
- 最大值池化:提取圖片紋理
- 均值池化:保留背景特徵
在TensorFlow中計算池化:
pool=tf.nn.max_pool(輸入描述,eg,[batch,28,28,6]
池化該描述(僅大小),eg.[1,2,2,1]
池化核滑動步長,eg.[1,2,2,1]
padding='SAME')
捨棄(Dropout)
在神經網絡的訓練過程中,將一部分神經元按照一定概率從神經網絡中暫時捨棄。防止過擬合,這種捨棄僅僅是在訓練過程中的捨棄,在使用時被捨棄的神經元恢復鏈接。
在TensorFlow中使用捨棄:
tf.nn.dropout(上層輸出,暫時捨棄的概率)
if train: 輸出=tf.nn.dropout(上層輸出,暫時捨棄的概率)
總結
卷積神經網絡:藉助卷積核(kernel)提取特徵後,送入全連接網絡。
CNN模型的主要模塊:
CNN模型的發展歷史: