1. 程式人生 > >RGB彩圖卷積過程

RGB彩圖卷積過程

轉載自:http://lib.csdn.net/article/aimachinelearning/42986

在CNN中,濾波器filter(帶著一組固定權重的神經元)對區域性輸入資料進行卷積計算。每計算完一個數據視窗內的區域性資料後,資料視窗不斷平移滑動,直到計算完所有資料。這個過程中,有這麼幾個引數: 
  a. 深度depth:神經元個數,決定輸出的depth厚度。同時代表濾波器個數。
  b. 步長stride:決定滑動多少步可以到邊緣。

  c. 填充值zero-padding:在外圍邊緣補充若干圈0,方便從初始位置以步長為單位可以剛好滑倒末尾位置,通俗地講就是為了總長能被步長整除。 

  這裡寫圖片描述 

    cs231n課程中有一張卷積動圖,貌似是用d3js 和一個util 畫的,我根據cs231n的卷積動圖依次截取了18張圖,然後用一gif 製圖工具製作了一gif 動態卷積圖。如下gif 圖所示

    可以看到:

  • 兩個神經元,即depth=2,意味著有兩個濾波器。
  • 資料視窗每次移動兩個步長取3*3的區域性資料,即stride=2。
  • zero-padding=1。

    然後分別以兩個濾波器filter為軸滑動陣列進行卷積計算,得到兩組不同的結果。

    如果初看上圖,可能不一定能立馬理解啥意思,但結合上文的內容後,理解這個動圖已經不是很困難的事情:

  • 左邊是輸入(7*7*3中,7*7代表影象的畫素/長寬,3代表R、G、B 三個顏色通道)
  • 中間部分是兩個不同的濾波器Filter w0、Filter w1
  • 最右邊則是兩個不同的輸出

    隨著左邊資料視窗的平移滑動,濾波器Filter w0 / Filter w1對不同的區域性資料進行卷積計算。

    值得一提的是:

  1. 左邊資料在變化,每次濾波器都是針對某一區域性的資料視窗進行卷積,這就是所謂的CNN中的區域性感知
    機制。
  • 打個比方,濾波器就像一雙眼睛,人類視角有限,一眼望去,只能看到這世界的區域性。如果一眼就看到全世界,你會累死,而且一下子接受全世界所有資訊,你大腦接收不過來。當然,即便是看區域性,針對區域性裡的資訊人類雙眼也是有偏重、偏好的。比如看美女,對臉、胸、腿是重點關注,所以這3個輸入的權重相對較大。

與此同時,資料視窗滑動,導致輸入在變化,但中間濾波器Filter w0的權重(即每個神經元連線資料視窗的權重)是固定不變的,這個權重不變即所謂的CNN中的引數(權重)共享機制。

  • 再打個比方,某人環遊全世界,所看到的資訊在變,但採集資訊的雙眼不變。btw,不同人的雙眼 看同一個區域性資訊 所感受到的不同,即一千個讀者有一千個哈姆雷特,所以不同的濾波器 就像不同的雙眼,不同的人有著不同的反饋結果。

    我第一次看到上面這個動態圖的時候,只覺得很炫,另外就是據說計算過程是“相乘後相加”,但到底具體是個怎麼相乘後相加的計算過程 則無法一眼看出,網上也沒有一目瞭然的計算過程。本文來細究下。

    首先,我們來分解下上述動圖,如下圖

    接著,我們細究下上圖的具體計算過程。即上圖中的輸出結果1具體是怎麼計算得到的呢?其實,類似wx + b,w對應濾波器Filter w0,x對應不同的資料視窗,b對應Bias b0,相當於濾波器Filter w0與一個個資料視窗相乘再求和後,最後加上Bias b0得到輸出結果1,如下過程所示:

1* 0 + 1*0 + -1*0 

+

-1*0 + 0*0 + 1*1

+

-1*0 + -1*0 + 0*1

 

+

-1*0 + 0*0 + -1*0

+

0*0 + 0*1 + -1*1

+

1*0 + -1*0 + 0*2

 

+

0*0 + 1*0 + 0*0

+

1*0 + 0*2 + 1*0

+

0*0 + -1*0 + 1*0

 

+

 

1

=

1

    然後濾波器Filter w0固定不變,資料視窗向右移動2步,繼續做內積計算,得到0的輸出結果

    最後,換做另外一個不同的濾波器Filter w1、不同的偏置Bias b1,再跟圖中最左邊的資料視窗做卷積,可得到另外一個不同的輸出。