1. 程式人生 > 實用技巧 >卷積神經網路--全連線層

卷積神經網路--全連線層

在這裡插入圖片描述

CNN 入門講解:什麼是全連線層(Fully Connected Layer)?

我們講到啟用函式(Activation Function),假設我們經過一個Relu之後的輸出如下

Relu:在這裡插入圖片描述
在這裡插入圖片描述
然後開始到達全連線層
在這裡插入圖片描述
以上圖為例,我們仔細看上圖全連線層的結構,全連線層中的每一層是由許多神經元組成的(1x 4096)的平鋪結構,上圖不明顯,我們看下圖
在這裡插入圖片描述
注:上圖和我們要做的下面運算無聯絡
並且不考慮啟用函式和bias
當我第一次看到這個全連線層,我的第一個問題是:
它是怎麼樣把3x3x5的輸出,轉換成1x4096的形式
在這裡插入圖片描述
很簡單,可以理解為在中間做了一個卷積
在這裡插入圖片描述
從上圖我們可以看出,我們用一個3x3x5的filter 去卷積啟用函式的輸出,得到的結果就是一個fully connected layer 的一個神經元的輸出,這個輸出就是一個值

因為我們有4096個神經元
我們實際就是用一個3x3x5x4096的卷積層去卷積啟用函式的輸出

以VGG-16再舉個例子吧
再VGG-16全連線層中
對224x224x3的輸入,最後一層卷積可得輸出為7x7x512,如後層是一層含4096個神經元的FC,則可用卷積核為7x7x512x4096的全域性卷積(valid模式)來實現這一全連線運算過程。
這一步卷積一個非常重要的作用
就是把分散式特徵representation對映到樣本標記空間
就是它把特徵representation整合到一起,輸出為一個值
這樣做,有一個什麼好處?
就是大大減少特徵位置對分類帶來的影響

來,讓我來舉個簡單的例子
在這裡插入圖片描述
從上圖我們可以看出,貓在不同的位置,輸出的feature值相同,但是位置不同
對於電腦來說,特徵值相同,但是特徵值位置不同,那分類結果也可能不一樣
而這時全連線層filter的作用就相當於
喵在哪我不管
我只要喵
於是我讓filter去把這個喵找到
實際就是把feature map 整合成一個值
這個值大
哦,有喵
這個值小
那就可能沒喵
和這個喵在哪關係不大了有沒有
魯棒性有大大增強了有沒有
因為空間結構特性被忽略了,所以全連線層不適合用於在方位上找Pattern的任務,比如segmentation

我們突然發現全連線層有兩層1x4096fully connected layer平鋪結構(有些網路結構有一層的,或者二層以上的)

好吧也不是突然發現,我只是想增加一點戲劇效果

在這裡插入圖片描述
但是大部分是兩層以上呢
泰勒公式都知道吧
意思就是用多項式函式去擬合光滑函式
我們這裡的全連線層中一層的一個神經元就可以看成一個多項式
我們用許多神經元去擬合數據分佈
但是隻用一層fully connected layer 有時候沒法解決非線性問題
而如果有兩層或以上fully connected layer就可以很好地解決非線性問題了
我們都知道,全連線層之前的作用是提取特徵
全連結層的作用是分類

我們現在的任務是去區別一圖片是不是貓
在這裡插入圖片描述
假設這個神經網路模型已經訓練完了
全連線層已經知道
在這裡插入圖片描述
當我們得到以上特徵,我就可以判斷這個東東是貓了
因為全連線層的作用主要就是實現分類(Classification)
從下圖,我們可以看出
在這裡插入圖片描述
紅色的神經元表示這個特徵被找到了(激活了)
同一層的其他神經元,要麼貓的特徵不明顯,要麼沒找到

當我們把這些找到的特徵組合在一起,發現最符合要求的是貓
ok,我認為這是貓了
那我們現在往前走一層
那們現在要對子特徵分類,也就是對貓頭,貓尾巴,貓腿等進行分類
比如我們現在要把貓頭找出來
在這裡插入圖片描述
貓頭有這麼些個特徵
於是我們下一步的任務
就是把貓頭的這麼些子特徵找到,比如眼睛啊,耳朵啊
在這裡插入圖片描述
道理和區別貓一樣
當我們找到這些特徵,神經元就被激活了(上圖紅色圓圈)
這細節特徵又是怎麼來的?
就是從前面的卷積層,下采樣層來的
至此,關於全連線層的資訊就簡單介紹完了
全連線層引數特多(可佔整個網路引數80%左右),近期一些效能優異的網路模型如ResNet和GoogLeNet等均用全域性平均池化(global average pooling,GAP)取代全連線層來融合學到的深度特徵
需要指出的是,用GAP替代FC的網路通常有較好的預測效能
於是還出現了
Fully Convolutional Networks for Semantic Segmentation​arxiv.org
(1)全連線層對模型的影響?
首先我們明白全連線層的組成如下:
在這裡插入圖片描述
二層全連線層結構
那麼全連線層對模型影響引數就是三個:
1.全接解層的總層數(長度)
2.單個全連線層的神經元數(寬度)
3.啟用函式
首先我們要明白啟用函式的作用是:增加模型的非線性表達能力
更詳細瞭解請去:
蔣竺波:CNN入門講解:什麼是啟用函式(Activation Function)​zhuanlan.zhihu.com
在這裡插入圖片描述
如果全連線層寬度不變,增加長度:
優點:神經元個數增加,模型複雜度提升;全連線層數加深,模型非線性表達能力提高。理論上都可以提高模型的學習能力。

如果全連線層長度不變,增加寬度:

**優點:**神經元個數增加,模型複雜度提升。理論上可以提高模型的學習能力。
難度長度和寬度都是越多越好?肯定不是
(1)**缺點:**學習能力太好容易造成過擬合。
(2)**缺點:**運算時間增加,效率變低。
那麼怎麼判斷模型學習能力如何?
看Training Curve 以及 Validation Curve,在其他條件理想的情況下,如果Training Accuracy 高, Validation Accuracy 低,也就是過擬合 了,可以嘗試去減少層數或者引數。如果Training Accuracy 低,說明模型學的不好,可以嘗試增加引數或者層數。至於是增加長度和寬度,這個又要根據實際情況來考慮了。

PS:很多時候我們設計一個網路模型,不光考慮準確率,也常常得在Accuracy/Efficiency 裡尋找一個好的平衡點。