卷積神經網路(Convolutional Neural Networks),CNN 也被稱為 CNNs 或 ConvNets,它是目前深度神經網路(deep neural network)領域的發展主力。CNN 在影像辨識中甚至可以超越人類辨識的精準度。

CNN是一個很直觀的演算法,CNN的概念跟人類以眼睛去辨識有模擬相似之處。先用CNN的始祖Model:LeNet ,以LeNet來介紹CNN的運作。以下是LeNet的模型架構 ( 源自Yann LeCun 1998年論文 )


LeNet Architecture, 1998

LetNet對輸入的圖片做了2次Convolutions(卷積)、2次Subsampling(採樣),跟2次Full connection(全連結),還有1次Gaussian connections (高斯連結);其中Convolution跟Subsampling是在對圖片做「特徵擷取」的動作,最後把特徵擷取出來後,後面再展開(flattering)用Full connection做「分類」。

【CNN要點】卷積神經網路就是:使用kernel(decoder)對圖片做特徵擷取,並找出最佳的特徵,以進行分類

卷積神經網路是通過神經網路反向傳播自動學習的手段,來得到各種有用的卷積核的過程。卷積神經網路由一個或多個卷積層和頂端的全連通層組成,也包括關聯權重和池化層(pooling layer)。使卷積神經網路能夠利用輸入資料的二維結構。卷積神經網路在圖像和語音辨識聚集佳的運作結果。這一模型也可以使用反向傳播演算法進行訓練。相比較其他深度、前饋神經網路,卷積神經網路需要考量的參數更少,使之成為一種頗具吸引力的深度學習結構。

卷積神經網路通過卷積(Convolution)和池化(Pooling)操作,自動學習圖像在各個層次上的特徵。
典型的卷積神經網路通常由以下三種Layers共同組成:卷積層(Convolution layer)子採樣池化層(Subsampling/ Pooling layer)、全連接層(Fully connected layer)。

卷積層(Convolution Layer):對輸入圖像進行降維和特徵抽取
卷積運算是線性操作,而神經網路要擬合的是非線性的函數,因此和前全連接網路類似,我們需要加上啟動函數,常用的有 sigmoid 函數,tanh 函數,ReLU 函數等。 神經網路前部卷積層有小的感受野,可以捕捉圖像局部、細節資訊,即輸出圖像的每個圖元(Activation啟動值)只是感受到輸入圖像很小範圍數值進行計算的結果。

卷積運算就是將原始圖片的與特定的Feature Detector(filter)做卷積運算(符號⊗)。卷積運算就是將下圖兩個3x3的矩陣作相乘後再相加,以下圖為例 0*0 + 0*0 + 0*1+ 0*1 + 1 *0 + 0*0 + 0*0 + 0*1 + 0*1 =0



中間的Feature Detector(Filter)會隨機產生好幾種(ex:16種)。Feature Detector的目的就是幫助我們萃取出圖片當中的一些特徵,模擬人大腦在判讀圖片時的反應和運作,如根據:形狀、顏色、輪廓、對比等特徵。在LeNet的架構中,第一層的卷積層,Input為32x32的image,經過Convolutions的時候出現6張28X28的Feature map。

池化層(Pooling)
通過卷積操作,我們完成了對輸入圖像的降維和特徵抽取,但特徵圖像的維數還是很高。維數高不僅計算耗時,而且容易導致過擬合。為此引入了下採樣技術,也稱為 pooling即池化操作。
Pooling常用的方式有二種,Max Pooling,Mean Pooling。Pooling的做法是對圖像的某一個區域用一個值代替,如最大值或平均值。如果採用最大值,叫做 max 池化;如果採用均值,叫做均值池化。

除了降低圖像尺寸之外,下採樣帶來的另外一個好處是平移、旋轉不變性,因為輸出值由圖像的一片區域計算得到,對於平移和旋轉並不敏感。
總結池化層作用:

  • 降維,縮減模型大小,提高計算速度
  • 降低過擬合Overfitting,提升特徵提取Robutness
  • 對”微小”的變化保持不變性(invariance), 旋轉、平移、伸縮等的不變性(不敏感)。(參考:討論)

池化層的具體實現是在進行卷積操作之後對得到的特徵圖像進行分塊,圖像被劃分成的不相交塊,計算這些塊內的最大值或平均值,得到池化後的圖像。
均值池化和 max 池化都可以完成下採樣操作,前者是線性函數,而後者是非線性函數,一般情況下 max 池化有更好的效果。
但近期一些性能優異的網路模型如ResNet和GoogLeNet等是採用全域均值池化(global average pooling,GAP)取代FC來融合學到的深度特徵。

Fully Connected Layer 全連接層
就是所謂的分類器,基本上全連接層的部分就是將之前的結果平坦化之後接到最基本的神經網絡了。


------------------------

全連接就是個矩陣乘法,相當於一個特徵空間變換,可以把前面所有有用的資訊提取整合。再加上啟動函數的非線性映射,多層全連接層理論上可以類比任何非線性變換。但缺點也很明顯: 無法保持空間結構。

全連接的一個作用是維度變換,尤其是可以把高維變到低維,同時把有用的資訊保留下來。全連接另一個作用是隱含語義的表達(embedding),把原始特徵映射到各個隱語義節點(hidden node)。對於最後一層全連接而言,就是分類的顯示表達。不同channel同一位置上的全連接等價與1x1的卷積。N個節點的全連接可近似為N個範本卷積後的均值池化(GAP)。

最近的論文,你會發現,FC可以用GAP(Global Average Pooling)的方法代替。

GAP就是:用 feature map 直接表示屬於某個類的 confidence map,比如有10個類,就在最後輸出10個 feature map,每個feature map中的值加起來求平均值,然後把得到的這些平均值直接作為屬於某個類別的 confidence value,再輸入softmax中分類, 更重要的是實驗效果並不比用 FC 差。

GAP的優勢是:

1.因為FC的參數眾多,這麼做就減少了參數的數量(在最近比較火的模型壓縮中,這個優勢可以很好的壓縮模型的大小)。
2.因為減少了參數的數量,可以很好的減輕過擬合的發生。
另外,這種直接用 feature map 表示屬於某個類的 confidence map 的做法很符合CNN的思想。

關於這點我的理解是這樣的:比如最後要分10個類,假設在有 FC 的 network 中,FC 前面一層的feature map 用 A 表示,A 經過 FC 的作用得到了一個 10 維的向量(假設用 C 表示),然後輸入softmax 等分類器中分類。既然CNN的學習能力很強,那為什麼不直接讓 CNN 學習輸出 C(而不是 A)呢?

可以看到這種思想和CNN結合的很好(FCN 也是用了類似的思想,以前的segmentation需要做很多的pre-processing/post-processing,比如region proposal等,然後用CNN提取特徵,雖然比較繁瑣但效果還是很好的。於是就有人想到,既然CNN那麼牛,乾脆什麼都讓CNN做,這樣就可以省去繁瑣的processing了,於是就出現了 pixel-to-pixel 的 segmentation)。
理解1:
卷積取的是局部特徵,全連接就是把以前的局部特徵重新通過權值矩陣組裝成完整的圖。
因為用到了所有的局部特徵,所以叫全連接。
理解2:
從卷積網路談起,卷積網路在形式上有一點點像咱們正在召開的“人民代表大會制度”。卷積核的個數相當於候選人,圖像中不同的特徵會啟動不同的“候選人”(卷積核)。
池化層(僅指最大池化)起著類似於“合票”的作用,不同特徵在對不同的“候選人”有著各自的喜好。
全連接相當於是“代表普選”。所有被各個區域選出的代表,對最終結果進行“投票”,全連接保證了receiptive field 是整個圖像,既圖像中各個部分(所謂所有代表),都有對最終結果影響的權利。
理解3:
假設你是一隻小螞蟻,你的任務是找小麵包。你的視野還比較窄,只能看到很小一片區域。當你找到一片小麵包之後,你不知道你找到的是不是全部的小麵包,所以你們全部的螞蟻開了個會,把所有的小麵包都拿出來分享了。全連接層就是這個螞蟻大會~
理解4:
例如經過卷積,relu後得到3x3x5的輸出。
那它是怎麼樣把3x3x5的輸出,轉換成1x4096的形式?




很簡單,可以理解為在中間做了一個卷積。

從上圖我們可以看出,我們用一個3x3x5的filter 去卷積啟動函數的輸出,得到的結果就是一個fully connected layer 的一個神經元的輸出,這個輸出就是一個值。因為我們有4096個神經元。我們實際就是用一個3x3x5x4096的卷積層去卷積啟動函數的輸出。
以VGG-16再舉個例子吧,
對224x224x3的輸入,最後一層卷積可得輸出為7x7x512,如後層是一層含4096個神經元的FC,則可用卷積核為7x7x512x4096的全域卷積來實現這一全連接運算過程。
它把特徵representation整合到一起,輸出為一個值。
這樣做,有一個什麼好處?就是大大減少特徵位置對分類帶來的影響。
舉個簡單的例子:

從上圖我們可以看出,貓在不同的位置,輸出的feature值相同,但是位置不同。
對於電腦來說,特徵值相同,但是特徵值位置不同,那分類結果也可能不一樣。
這時全連接層filter的作用就相當於
喵在哪我不管,我只要喵,於是我讓filter去把這個喵找到,
實際就是把feature map 整合成一個值,這個值大,有喵,這個值小,那就可能沒喵
和這個喵在哪關係不大了,魯棒性有大大增強。
因為空間結構特性被忽略了,所以全連接層不適合用於在方位上找Pattern的任務,比如segmentation。
全連接層中一層的一個神經元就可以看成一個多項式,
我們用許多神經元去擬合數據分佈
但是只用一層fully connected layer 有時候沒法解決非線性問題,
而如果有兩層或以上fully connected layer就可以很好地解決非線性問題了
我們都知道,全連接層之前的作用是提取特徵
全理解層的作用是分類
我們現在的任務是去區別一圖片是不是貓

假設這個神經網路模型已經訓練完了,全連接層已經知道

當我們得到以上特徵,我就可以判斷這個東東是貓了。 因為全連接層的作用主要就是實現分類(Classification),從下圖,我們可以看出紅色的神經元表示這個特徵被找到了(啟動了)。同一層的其他神經元,要麼貓的特徵不明顯,要麼沒找到,當我們把這些找到的特徵組合在一起,發現最符合要求的是貓。ok,我認為具有這些特徵的,這是貓了。

貓頭有這麼些個特徵,於是我們下一步的任務。就是把貓頭的這麼些子特徵找到,比如眼睛啊,耳朵啊。

 

這些細節特徵又是怎麼來的? 就是從前面的卷積層,subsampling pooling layer來的。

道理和區別貓一樣:當我們找到這些特徵,神經元就被啟動(紅色圓圈)了。

【References】

理解CNN卷積層、池化層、全連接層

機器學習 ML NOTE

Feature Extraction Using Convolution(stanford.tutorial)

資料分析&機器學習

Convolutional Neural Networks (LeNet) - DeepLearning 0.1 documentation)(DeepLearning 0.1. LISA Lab. [31 August 2013])

Convolutional Neural Network[2014-09-16].

https://brohrer.mcknote.com/zh-Hant/how_machine_learning_works/how_convolutional_neural_networks_work.html



隨機文章

×
網友回饋 回應:0
  • 歡迎來到隨意窩Xuite

    開啟選單瀏覽服務或以關鍵字搜尋。

     
  • 瀏覽更多精彩內容

    切換至格主其他頻道或直接搜尋。

     
  • 快速便利分享工具

    提供多種分享方式傳遞內容資訊。

     
  • 更多推薦APP

    隨意遊與隨食記app僅支援ios裝置。