1. 程式人生 > >解釋一下全連線層&CNN中全連線層是什麼樣的

解釋一下全連線層&CNN中全連線層是什麼樣的

(名稱:全連線。意思就是輸出層的神經元和輸入層的每個神經元都連線)

在卷積神經網路的最後,往往會出現一兩層全連線層,全連線一般會把卷積輸出的二維特徵圖轉化成一維的一個向量,這是怎麼來的呢?目的何在呢?

舉個例子:


最後的兩列小圓球就是兩個全連線層,在最後一層卷積結束後,進行了最後一次池化,輸出了20個12*12的影象,然後通過了一個全連線層變成了1*100的向量。

這是怎麼做到的呢,其實就是有20*100個12*12的卷積核卷積出來的,對於輸入的每一張圖,用了一個和影象一樣大小的核卷積,這樣整幅圖就變成了一個數了,如果厚度是20就是那20個核卷積完了之後相加求和。這樣就能把一張圖高度濃縮成一個數了。

全連線的目的是什麼呢?因為傳統的網路我們的輸出都是分類,也就是幾個類別的概率甚至就是一個數--類別號,那麼全連線層就是高度提純的特徵了,方便交給最後的分類器或者回歸。

但是全連線的引數實在是太多了,你想這張圖裡就有20*12*12*100個引數,前面隨便一層卷積,假設卷積核是7*7的,厚度是64,那也才7*7*64,所以現在的趨勢是儘量避免全連線,目前主流的一個方法是全域性平均值。

也就是最後那一層的feature map(最後一層卷積的輸出結果),直接求平均值。有多少種分類就訓練多少層,這十個數字就是對應的概率或者叫置信度。

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

CNN中全連線層是什麼樣的?


名稱:全連線。意思就是輸出層的神經元和輸入層的每個神經元都連線。

例子: AlexNet  網路中第一個全連線層是這樣的:

layer {
  name: "fc6"
  type: "InnerProduct"
  bottom: "pool5"
  top:"fc6"
  param {
    lr_mult: 1
    decay_mult: 1
  }
  param {
    lr_mult: 2
    decay_mult: 0
  }
  inner_product_param {
    num_output: 4096
    weight_filler {
      type: "gaussian"
      std: 0.005
    }
    bias_filler {
      type: "constant"
      value: 0.1
    }
  }
}

其中  bottom: "pool5"就是這個全連線層的輸入,而top:"fc6"就是這個全連線層的輸出。值得注意的地方是這個bottom: "pool5"是個“二維平面“式的資料,也就是N X M的陣列樣式,但是top:"fc6"確是一個K X 1或者 1 X K的向量,因此在實現中,程式會將bottom: "pool5"拉成N*M X 1或者1 X M*N的向量。

這個輸入向量是什麼呢?對,是特徵圖,符號化就是X(1)、X(2)、X(3)...X(N*M),括號內是X的下標。

那麼輸出呢?如果這個全連線層不是最後一個全連線層那麼它也是特徵圖,符號化就是Y(1)、Y(2)、Y(3)...Y(K),括號內是Y的下標。

那麼輸入和輸出是怎麼聯絡到一塊呢?答案就是W權重了,也叫濾波器,也叫卷積核。

那麼在全連線層裡怎麼沒看到這個濾波器的大小呢?答案是:不需要,因為它就是全連線啊。

一般情況下,輸入神經元的個數不等於輸出神經元的個數,那數目不等的輸入輸出神經元怎麼連線起來呢?還有,這個濾波器(卷積核)是什麼樣呢?可以看看下面例子:


其中(X1,X2,X3)就是輸入神經元(特徵圖),而(Y1Y2)就是輸出神經元(特徵圖),兩層之間的連線就是卷積核:,想想矩陣相乘,就明白1X3的“矩陣”怎麼變成1X2的矩陣了。

總的下來就是:

這個卷積核的形狀是在程式碼中自動計算出來的。