1. 程式人生 > >CNN中全連線層是什麼樣的?

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的矩陣了。

總的下來就是:

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