1. 程式人生 > >CNN卷積各層的引數和連結個數的計算(整合各路部落格總結)

CNN卷積各層的引數和連結個數的計算(整合各路部落格總結)

轉載自:http://blog.csdn.net/dcxhun3/article/details/46878999,但是加入了自己的理解

一、CNN概述

    卷積神經網路是一個多層的神經網路,每層由多個二維平面組成(每個層有多個Feature Map,每個Feature Map通過一種卷積濾波器提取輸入的一種特徵),而每個平面由多個獨立神經元組成。

圖1 卷積神經網路的概念示範

1. 輸入影象通過和三個可訓練的濾波器和可加偏置進行卷積,濾波過程如圖1,卷積後在C1層產生三個特徵對映圖

2. 然後特徵對映圖中每組的4個畫素再進行求和,加權值,加偏置,通過一個Sigmoid函式得到三個S2層的特徵對映圖。

3. 這些對映圖再進過濾波得到C3層。

4. 這個層級結構再和S2一樣產生S4。

5. 最終,這些畫素值被光柵化,並連線成一個向量輸入到傳統的神經網路,得到輸出。
 

    CNN一個牛逼的地方就在於通過感受野和權值共享減少了神經網路需要訓練的引數的個數,所謂權值共享就是同一個Feature Map中神經元權值共享,該Feature Map中的所有神經元使用同一組權值。因此:

     a. 引數個數: 與神經元的個數無關,只與卷積核的大小及Feature Map的個數相關。

     b. 共有多少個連線個數:就與神經元的個數相關了,神經元的個數也就是特徵圖的大小。

二、各層引數和連結數計算

舉例:

      下面以最經典的LeNet-5例子來逐層分析各層的引數及連線個數。   

圖2

C1層(卷積層):是一個卷積層,由6個特徵圖Feature Map構成。特徵圖中每個神經元與5*5的鄰域(濾波器)相連。

1. 特徵圖大小:特徵圖的大小28*28,這樣能防止輸入的連線掉到邊界之外(32-5+1=28)。

feature map邊長大小的具體計算參見:http://blog.csdn.net/qq_15192373/article/details/78393520

2. 引數個數:C1有156個可訓練引數 (每個濾波器5*5=25個unit引數和一個bias引數,一共6個濾波器,共(5*5+1)*6=156個引數)

3. 連結個數/FLOPS個數::(5*5+1)*6 *(28*28)=122,304個。左邊是濾波器在輸入層滑過的神經元個數,右邊是C1層每個feature map的神經元個數,左右對應關係是1對28*28,相乘即為連線數。(每個連結對應1次計算,由wa+b可知,每個引數參與1次計算,所以1個單位的偏置b也算進去)

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

S2層(下采樣層):是一個下采樣層,有6個14*14的特徵圖。特徵圖中的每個單元與C1中相對應特徵圖的2*2鄰域相連線。

1. 特徵圖大小:每個單元的2*2感受野並不重疊,因此S2中每個特徵圖的大小是C1中特徵圖大小的1/4(行和列各1/2)

2. 引數個數:S2層有 12個 (6*(1+1)=12) 可訓練引數。S2層 每個濾波器路過的4個鄰域 的4個輸入相加,乘以1個可訓練引數w,再加上1個可訓練偏置b(即一個濾波器對應兩個引數)。(對於子取樣層,每一個特徵對映圖的的可變引數需要考慮你使用的取樣方式而定,如文中的取樣方式,每一個特徵對映圖的可變引數數量為2個,有的取樣方式不需要引數)

3. 連結個數/FLOPS個數:5880個連線,( (2*2+1)*6 *14*14=5880) 。左邊是濾波器在C1層滑過的神經元個數,右邊是S2層每個feature map的神經元個數,相乘即為連線數。

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

C3層(卷積層):是一個卷積層,它同樣通過5x5的卷積核去卷積層S2,然後得到的特徵map就只有10x10個神經元,但是它有16種不同的卷積核,所以就存在16個特徵map了。

1. 特徵圖大小:C3中每個特徵圖由S2中所有6個或者幾個特徵map組合(幾個濾波器計算的神經元的值 相加 合併成一個神經元)而成。

為什麼不把S2中的每個特徵圖連線到每個C3的特徵圖呢?原因有2點。

第1,不完全的連線機制將連線的數量保持在合理的範圍內。

第2,也是最重要的,其破壞了網路的對稱性。由於不同的特徵圖有不同的輸入,所以迫使他們抽取不同的特徵(希望是互補的)。(14-5+1=10)

2. 引數個數:例如,存在的一個方式是:

C3的前6個特徵圖:相當於需要6組濾波器,每組以S2中 3個相鄰 特徵圖子集 為輸入,共享一個偏置。(C3每個特徵圖 由 S2中3個特徵圖分別用不同濾波器 再加和得到)

C3的接下來6個特徵圖:相當於需要6組濾波器,每組以S2中 4個相鄰 特徵圖子集 為輸入,共享一個偏置。(1對4)

C3的接下來3個特徵圖:相當於需要3組濾波器,每組以S2中 4個不相鄰 特徵圖子集 為輸入,共享一個偏置。(1對4)

C3的最後1個特徵圖:相當於需要1組濾波器,每組將S2中所有 特徵圖 為輸入,共享一個偏置。(1對6)

    這樣C3層有1516個可訓練引數。計算:6*(3*25+1)+6*(4*25+1)+3*(4*25+1)+(25*6+1)=1516。此處,C3個特徵圖由 S2中n個卷積結果合併,然後共享1個b,組合計算得到。

3. 連結個數/FLOPS個數:1516* 10*10=151600個連線。左邊是濾波器滑過的S2層神經元個數,右邊是C3層特徵圖大小。

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

S4層(下采樣層):是一個下采樣層,由16個5*5大小的特徵圖構成。特徵圖中的每個單元與C3中相應特徵圖的2*2鄰域相連線,跟C1和S2之間的連線一樣。

1. 特徵圖大小:5*5大小。每個單元的2*2感受野並不重疊,因此S2中每個特徵圖的大小是C1中特徵圖大小的1/4(行和列各1/2

2. 引數個數:S4層有32個可訓練引數。(每個特徵圖1個因子w1個偏置b,16*(1+1)=32)

3. 連結個數/FLOPS個數:16* (2*2+1) *5*5=2000個連線。左邊是濾波器在C3層滑過的神經元個數,右邊是S4層神經元個數,相乘即為連線數。

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

C5層(卷積層或第一個全連線層):是一個卷積層,有120個特徵圖(或者說神經元)。每個單元與S4層的全部16個單元的5*5鄰域(與S4層特徵圖一樣大)相連。(120組濾波器, 每組16個濾波器,分別與 S4層16個特徵圖 進行卷積, 每組得到C5層的一個神經元/特徵圖)

1. 特徵圖大小:由於S4層特徵圖的大小也為5*5(同濾波器一樣),故C5特徵圖的大小為1*1。(5-5+1=1), 這構成了S4和C5之間的全連線。之所以仍將C5標示為卷積層而非全相聯層,是因為如果LeNet-5的輸入變大,而其他的保持不變,那麼此時特徵圖的維數就會比1*1大。

2. 引數個數:120* (16*5*5+1)=48120個。濾波器個數120*16個,所以w有120*16*5*5個,同組16個濾波器共用一個b,所以有120個b。

3. 連結個數/FLOPS個數:48120*1*1, 左邊是濾波器滑過的神經元個數,右邊是C5層特徵圖大小(其實現在已經變成了單個神經元,大小1*1),相乘即為連線數,此處也即FLOPS個數。

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

F6層(全連線層):雖然是全連線層,得到F6層每個神經元 由 每組120個1*1的濾波器對C5層卷積,一共84組濾波器,得到84個神經元。

1. 特徵圖大小:有84個單元(之所以選這個數字的原因來自於輸出層的設計),與C5層全相連。

2. 引數個數:有 84* (120*(1*1)+1)=10164 個可訓練引數。如同經典神經網路,F6層計算輸入向量(120)權重向量(1*1)之間的點積,再加上一個偏置(+1)。然後將其傳遞給sigmoid函式產生單元i的一個狀態。

3. 連結個數/FLOPS個數:10164* 1*1,左邊是濾波器在C5層滑過的神經元個數,右邊是F6層特徵圖大小。1個連結對應1次計算。

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

輸出層:由歐式徑向基函式(Euclidean Radial Basis Function)單元組成,每類一個單元,每個有84個輸入。

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

三、卷積和下采樣說明

圖3 卷積和子取樣過程

卷積過程包括:用一個可訓練的濾波器fx去卷積一個輸入的影象(第一階段是輸入的影象,後面的階段就是卷積特徵map了),然後加一個偏置bx,得到卷積層Cx。

子取樣過程包括:每鄰域四個畫素求和變為一個畫素,然後通過標量Wx+1加權,再增加偏置bx+1,然後通過一個sigmoid啟用函式,產生一個大概縮小四倍的特徵對映圖Sx+1。