1. 程式人生 > 實用技巧 >3.2 CNN卷積神經網路基礎知識-卷積操作(百度架構師手把手帶你零基礎實踐深度學習原版筆記系列)

3.2 CNN卷積神經網路基礎知識-卷積操作(百度架構師手把手帶你零基礎實踐深度學習原版筆記系列)

3.2 CNN卷積神經網路基礎知識-卷積操作(百度架構師手把手帶你零基礎實踐深度學習原版筆記系列)

這一小節將為讀者介紹卷積演算法的原理和實現方案,並通過具體的案例展示如何使用卷積對圖片進行操作,主要涵蓋如下內容:

目錄

3.2 CNN卷積神經網路基礎知識(百度架構師手把手帶你零基礎實踐深度學習原版筆記系列)

卷積計算

填充(padding)

步幅(stride)

感受野(Receptive Field)

多輸入通道、多輸出通道和批量操作


卷積計算

卷積是數學分析中的一種積分變換的方法,在影象處理中採用的是卷積的離散形式。這裡需要說明的是,在卷積神經網路中,卷積層的實現方式實際上是數學中定義的互相關 (cross-correlation)運算,與數學分析中的卷積定義有所不同,這裡跟其他框架和卷積神經網路的教程保持一致,都使用互相關運算作為卷積的定義,具體的計算過程如圖7

所示。



圖7:卷積計算過程



說明:

卷積核(kernel)也被叫做濾波器(filter),假設卷積核的高和寬分別為kh​和kw​,則將稱為kh×kw卷積,比如3×5卷積,就是指卷積核的高為3, 寬為5。


  • 如圖7(a)所示:左邊的圖大小是3×3,表示輸入資料是一個維度為3×3的二維陣列;中間的圖大小是2×2,表示一個維度為2×2的二維陣列,我們將這個二維陣列稱為卷積核。先將卷積核的左上角與輸入資料的左上角(即:輸入資料的(0, 0)位置)對齊,把卷積核的每個元素跟其位置對應的輸入資料中的元素相乘,再把所有乘積相加,得到卷積輸出的第一個結果

  • 如圖7(b)所示:將卷積核向右滑動,讓卷積核左上角與輸入資料中的(0,1)位置對齊,同樣將卷積核的每個元素跟其位置對應的輸入資料中的元素相乘,再把這4個乘積相加,得到卷積輸出的第二個結果,

  • 如圖7(c)所示:將卷積核向下滑動,讓卷積核左上角與輸入資料中的(1, 0)位置對齊,可以計算得到卷積輸出的第三個結果,

  • 如圖7(d)所示:將卷積核向右滑動,讓卷積核左上角與輸入資料中的(1, 1)位置對齊,可以計算得到卷積輸出的第四個結果,

卷積核的計算過程可以用下面的數學公式表示,其中a代表輸入圖片,b代表輸出特徵圖,w是卷積核引數,它們都是二維陣列,∑u,v表示對卷積核引數進行遍歷並求和。

(公式看起來很複雜,但計算方式很簡單啦,就是對應位置相乘最後相加)

舉例說明,假如上圖中卷積核大小是2×2,則u可以取0和1,v也可以取0和1,也就是說:

讀者可以自行驗證,當[i,j][i, j][i,j]取不同值時,根據此公式計算的結果與上圖中的例子是否一致。

  • 【思考】 當卷積核大小為3×3時,b和a之間的對應關係應該是怎樣的?

其它說明:

在卷積神經網路中,一個卷積運算元除了上面描述的卷積過程之外,還包括加上偏置項的操作。例如假設偏置為1,則上面卷積計算的結果為:


填充(padding)

在上面的例子中,輸入圖片尺寸為3×3,輸出圖片尺寸為2×2,經過一次卷積之後,圖片尺寸變小。卷積輸出特徵圖的尺寸計算方法如下:

如果輸入尺寸為4,卷積核大小為3時,輸出尺寸為4−3+1=2。讀者可以自行檢查當輸入圖片和卷積核為其他尺寸時,上述計算式是否成立。通過多次計算我們發現,當卷積核尺寸大於1時,輸出特徵圖的尺寸會小於輸入圖片尺寸。說明經過多次卷積之後尺寸會不斷減小。為了避免卷積之後圖片尺寸變小,通常會在圖片的外圍進行填充(padding),如圖8所示。



圖8:圖形填充


  • 如圖8(a)所示:填充的大小為1,填充值為0。填充之後,輸入圖片尺寸從4×4變成了6×6,使用3×3的卷積核,輸出圖片尺寸為4×4。

  • 如圖8(b)所示:填充的大小為2,填充值為0。填充之後,輸入圖片尺寸從4×4變成了8×8,使用3×3的卷積核,輸出圖片尺寸為6×6。

如果在圖片高度方向,在第一行之前填充ph1行,在最後一行之後填充ph2​行;在圖片的寬度方向,在第1列之前填充pw1​列,在最後1列之後填充pw2列;則填充之後的圖片尺寸為(H+ph1+ph2)×(W+pw1+pw2)。經過大小為kh×kw的卷積核操作之後,輸出圖片的尺寸為:

在卷積計算過程中,通常會在高度或者寬度的兩側採取等量填充,即ph1=ph2=ph,pw1=pw2=pw,上面計算公式也就變為:

卷積核大小通常使用1,3,5,7這樣的奇數,如果使用的填充大小為ph=(kh−1)/2,pw=(kw−1)/2,則卷積之後影象尺寸不變。例如當卷積核大小為3時,padding大小為1,卷積之後影象尺寸不變;同理,如果卷積核大小為5,使用padding的大小為2,也能保持影象尺寸不變。

步幅(stride)

圖8中卷積核每次滑動一個畫素點,這是步幅為1的特殊情況。圖9是步幅為2的卷積過程,卷積核在圖片上移動時,每次移動大小為2個畫素點。


圖9:步幅為2的卷積過程


當寬和高方向的步幅分別為sh​和sw​時,輸出特徵圖尺寸的計算公式是:

(有個細節,可能存在不能整除的情況,這裡我們根據原理顯然知道應該進行向下取整就好啦,程式碼上Floor)

假設輸入圖片尺寸是H×W=100×100,卷積核大小kh×kw=3×3,填充ph=pw=1,步幅為sh=sw=2,則輸出特徵圖的尺寸為:

感受野(Receptive Field)

輸出特徵圖上每個點的數值,是由輸入圖片上大小為kh×kw​的區域的元素與卷積核每個元素相乘再相加得到的,所以輸入影象上kh×kw​區域內每個元素數值的改變,都會影響輸出點的畫素值。我們將這個區域叫做輸出特徵圖上對應點的感受野。感受野內每個元素數值的變動,都會影響輸出點的數值變化。比如3×3卷積對應的感受野大小就是3×3,如圖10所示。



圖10:感受野為3×3的卷積


而當通過兩層3×3的卷積之後,感受野的大小將會增加到5×5,如圖11所示。



圖11:感受野為5×5的卷積


因此,當增加捲積網路深度的同時,感受野將會增大,輸出特徵圖中的一個畫素點將會包含更多的影象語義資訊。

多輸入通道、多輸出通道和批量操作

前面介紹的卷積計算過程比較簡單,實際應用時,處理的問題要複雜的多。例如:對於彩色圖片有RGB三個通道,需要處理多輸入通道的場景。輸出特徵圖往往也會具有多個通道,而且在神經網路的計算中常常是把一個批次的樣本放在一起計算,所以卷積運算元需要具有批量處理多輸入和多輸出通道資料的功能,下面將分別介紹這幾種場景的操作方式。

  • 多輸入通道場景

上面的例子中,卷積層的資料是一個2維陣列,但實際上一張圖片往往含有RGB三個通道,要計算卷積的輸出結果,卷積核的形式也會發生變化。假設輸入圖片的通道數為Cin,輸入資料的形狀是Cin​,計算過程如圖12所示。

  1. 對每個通道分別設計一個2維陣列作為卷積核,卷積核數組的形狀是Cin×kh×kw。

  2. 對任一通道cin∈[0,Cin),分別用大小為kh×kw​的卷積核在大小為Hin×Win​的二維陣列上做卷積。

  3. 將這Cin個通道的計算結果相加,得到的是一個形狀為Hout×Wout的二維陣列。


圖12:多輸入通道計算過程


  • 多輸出通道場景

一般來說,卷積操作的輸出特徵圖也會具有多個通道Cout,這時我們需要設計Cout個維度為Cin×kh×kw的卷積核,卷積核數組的維度是Cout×Cin×kh×kw​,如圖13所示。

  1. 對任一輸出通道cout∈[0,Cout),分別使用上面描述的形狀為Cin×kh×kw的卷積核對輸入圖片做卷積。
  2. 將這Cout個形狀為Hout×Wout​的二維陣列拼接在一起,形成維度為Cout×Hout×Wout的三維陣列。

說明:

通常將卷積核的輸出通道數叫做卷積核的個數。



圖13:多輸出通道計算過程


  • 批量操作

在卷積神經網路的計算中,通常將多個樣本放在一起形成一個mini-batch進行批量操作,即輸入資料的維度是N×Cin×Hin×Win​。由於會對每張圖片使用同樣的卷積核進行卷積操作,卷積核的維度與上面多輸出通道的情況一樣,仍然是Cout×Cin×kh×kw​,輸出特徵圖的維度是N×Cout×Hout×Wout,如圖14所示。



圖14:批量操作