1. 程式人生 > >CNN 卷積神經網路結構

CNN 卷積神經網路結構

CNN

cnn每一層會輸出多個feature map, 每個Feature Map通過一種卷積濾波器提取輸入的一種特徵,每個feature map由多個神經元組成,假如某個feature map的shape是m*n, 則該feature map有m*n個神經元。對於卷積層會有kernel, 記錄上一層的feature map與當前層的卷積核的權重,因此kernel的shape為(上一層feature map的個數,當前層的卷積核數)。本文預設子取樣過程是沒有重疊的,卷積過程是每次移動一個畫素,即是有重疊的。預設子取樣層沒有權重和偏置。關於CNN的其它描述不在這裡論述,可以參考一下參考文獻。只關注如何訓練CNN。

CNN網路結構

一種典型卷積網路結構是LeNet-5,用來識別數字的卷積網路。結構圖如下(來自Yann LeCun的論文):
LeNet-5
卷積神經網路演算法的一個實現文章中,有一個更好看的圖:
LeNet-5
該圖的輸入是一張28*28大小的影象,在C1層有6個5*5的卷積核,因為C1層輸出6個(28-5+1)(28-5+1)大小的feature map。然後經過子取樣層,這裡假設子取樣層是對卷積層的均值處理(mean pooling), 其實一般還會有加偏置和啟用的操作,為了簡化,省略了這兩步,只是對卷積層進行一個取樣的操作。因此S2層輸出的6個feature map大小為(24/2)(24/2).在卷積層C3中,它的輸入是6個feature map,與C1不一樣(C1只有一個feature map,如果是RGB的話,C1會有三個channel)。C3層有12個5*5卷積核,每個卷積核會與上一層的6個feature map分別做卷積(事實上,一般是選擇幾種輸入feature map來做卷積,而不是全部的feature map),然後對這6個卷積結果求和組成一個新的feature map,即該層會有12個大小為(12-5+1)*(12-5+1)的feature map,這個feature map是經過sigmod 函式處理然後結果下一層S4。
這裡寫圖片描述


圖片來源

同理,S4層有12個(與卷積層的feature map數一致)大小為(8/2)*(8/2)的feature map。輸出層把S4層的feature mapflatten一個向量,向量長度為12*4*4=192,以該向量作為輸入,與下面的其它層全連線,進行分類等操作,也就是說把一張圖片變成一個向量,接入到別的網路,如傳統的BP神經網路,不過從整體來看,CNN可以看做是一個BP神經網路。在這裡有兩張很生動的圖來描述這個過程:
這裡寫圖片描述
這裡寫圖片描述

權值共享理解

從程式碼的實現來看,每個卷積核會與部分或全部的輸入(上一層輸出)feature map進行卷積求和,但是每個卷積核的權重與一個feature map是一一對應,如上一章節中的C3-S4,說是有12個卷積核,然後就有12個輸出feature map,但是每個卷積核與輸入的6個feature map的權重都是不一樣,即kernel不一樣,也就是說每個卷積核的權重與一個feature map是一一對應。至於權值共享的話,對於同一個輸入的feature map的神經元patch,用的是同一個卷積核權重,這個是共享的,只在同feature map共享,不在跨feature map共享,只是個人理解,有可能有錯,if wrong please correct me.