神經網絡-卷積神經網絡

1.卷積神經網絡概覽

來自吳恩達課上一張圖片,通過對應位置相乘求和,我們從左邊矩陣得到了右邊矩陣,邊緣是白色寬條,當圖片像素大一些時候,邊緣就會變細。觀察卷積核,左邊一列權重高,右邊一列權重低。輸入圖片,左邊的部分明亮,右邊的圖片部分灰暗。這個學到的邊緣是權重大的寬條(都是30),表示是由亮向暗過渡,下面這個圖左邊暗右邊亮,學到的邊界是暗的(權重-30),表示由暗向亮過渡。

上面爲了理解卷積到底是如何進行邊緣識別的,在神經網絡中,通過將卷積設成參數,反向傳播算法來進行更新,從而學到這個卷積核,不僅僅可以識別出垂直邊緣、水平邊緣,甚至可以學到70度,45度邊緣等。

爲了防止邊緣像素信息丟失,可以對輸入矩陣進行填充, 設原始輸入維度n,卷積大小f,步長s,那麼卷積操作後長度爲:向上取整(n-f+1/s);填充邊緣長度爲p,那麼卷積操作後長度爲:向上取整(n+2p-f+1/s);所以可以根據想要的卷積後大小求出填充邊緣長度p。

爲什麼卷積通常是奇數長度,只能使用不對稱填充,比如當步長爲1,讓輸入和輸出大小相等,p=f-1/2,如果f是偶數,左右兩邊肯定需要一邊多一邊少,奇數卷積,會有一箇中心點,直接指出卷積的位置,

tensorflow中實現卷積前向傳播的函數是tf.nn.conv2d(input,卷積參數,步長,padding='SAME/VALID'表示填充0/不填充)。

識別彩色圖片,輸入的像素是RGB三個維度的,這裏引入通道的概念,卷積核的通道個數跟輸入通道個數必須一致,這個卷積核的結果是把三個通道的對應乘積求和,這裏淺黃色是一個卷積核,與輸入相乘後得到27個數,27個數想加得到輸出的一個點。有多少個卷積核,就是輸出的深度。參數個數就是(3*3*3+1)*2,其中1是每個卷積核有一個偏置項,2是兩個卷積核。

卷積層連着卷積層也可以做一個卷積神經網絡,如果目標是二分類就用logistic,如果是多分類就用softmax,作用在最後一層的輸出節點上,這裏是7x7x40,共1960個數。下面看看爲什麼要有池化層~

池化層,最大池化,與卷積一樣,順次移動池化層矩陣,落入池化層矩陣中的數字取一個max,最大值可能提取的特徵是一個邊界,圖片中的一隻眼睛,就是比較重要的特徵。在卷積核裏提取的特徵,保留其最大值,池化層爲什麼不補0,自問一句,卷積層補0是因爲邊緣的點被計算的次數較少,防止漏掉邊緣特徵,所以補0,池化層提取最大的特徵值,都在其中了,不會丟失信息,不需要補0?但是還是會存在邊緣被計算的次數少呀。每個信道都單獨執行池化,3個信道,池化層的深度也是3,池化層參數有,池化窗口大小,步長,常用的是2*2的,相當於長度和寬度各縮小一半,池化層沒有要學習的參數,反向傳播也沒有什麼要更新的,是一個靜態的層,就長度寬度和步長需要手動設定或者是交叉驗證。

LeNet-5網絡:輸入32X32X3,通過6個5*5*3卷積核,產生28x28x6輸出,通過2x2最大池化層,得到14x14x6,然後進入下一層,通過16個10x10x6卷積核,然後通過2x2最大池化層,得到5x5x16,也就是400個輸出,然後是兩層全連接,120和84個節點,最後套一層softmax。高度和寬度也就是窗口大小是不斷縮小的,通道數量不斷增加。

卷積層相對於全連接層有啥優勢?參數共享和稀疏連接,距離輸入32X32X3(3072),通過6個5*5*3卷積核(450個參數),產生28x28x6(4704)輸出,如果用全連接,是3072*4704個參數。參數共享,比如一個垂直邊界檢測的卷積核,適用與圖片的任何一個子片段,稀疏連接,是指輸出某一個值只依賴於卷積核窗口裏的元素,其餘元素無關,此外卷積核使得圖片的特徵平移後不變,比如眼睛在左上,移到中間,還是會被卷積核提取出來,原因就是分塊提取局部特徵。

2.相關問題

(1)卷積的作用

一定大小的卷積核用來提取局部特徵,比如邊緣濾波,卷積中的參數是通過網絡訓練學習出來的,因爲卷積核可以包含橫向、縱向濾波,甚至45度70度等傾斜的濾波,多個濾波器,還可以提取圖片上的顏色、邊緣等特徵,再通過非線性激活、池化,一層層提取特徵。卷積相對於全連接主要起到了,可以減少參數、提升泛化能力,減少參數通過參數共享和稀疏連接,卷積核可以在圖片上多個位置提取特徵使用即爲參數共享,稀疏連接是指卷積覈計算後輸出的數據點,只跟上一層部分神經元連接。全連接層沒有考慮像素位置之間的信息,圖像識別中離得近的像素點聯繫比較緊密,離得遠的聯繫就很小,全連接表示的意思是所有像素點都同等對待,那麼網絡學習之後可能會發現大部分權重值很小,只有少部分神經元權重很大,那麼耗費大量時間來學習很多無關緊要的參數,這種學習是低效的,卷積考慮了圖片像素之間的位置信息,並且提取出有用的局部特徵。卷積層每層的參數的個數只和這層的fi過濾器的大小、數目有關,而和輸入的規模無關。這樣可以通過控制參數的數量避免過擬合了。

池化層,就是進一步做採樣,縮小參數個數,最大池化層就是抽取卷積層中提取特徵的關鍵部分,平均池化層更多保留整體信息,比如圖片背景信息。池化層沒有參數,只有池化大小和步長,在前向傳播時候就是把將池化窗口中的最大值傳給下一層,反向傳播就把後面傳過來的梯度遞給剛纔那個max元素,其他梯度都爲0.。

常用的激活函數有sigmoid函數和relu函數.
Relu(x)={if x>0 then x;else 0}爲了在反向傳播算法中可以正常使用,將其在x=0x=0處的導數置爲1,所以它的導數也就變爲了 δRelu(x)={if x>0 then 1 else 0}
Relu是一個非常優秀的激活哈數,相比較於傳統的Sigmoid函數,有三個作用

  1. 防止梯度彌散,sigmoid的導數只有在0附近的時候有比較好的激活性,在正負飽和區的梯度都接近於0,所以這會造成梯度彌散,而relu函數在大於0的部分梯度爲常數,所以不會產生梯度彌散現象。
  2. 稀疏激活性:elu函數在負半區的導數爲0 ,所以一旦神經元激活值進入負半區,那麼梯度就會爲0,也就是說這個神經元不會經歷訓練,即所謂的稀疏性。
  3. 加快計算: relu函數的導數計算更快,程序實現就是一個if-else語句,而sigmoid函數要進行浮點四則運算