深度学习之卷积神经网络(2)卷积神经网络结构
深度學習之卷積神經網絡(2)卷積神經網絡結構
- 1. 單通道輸入和單卷積核
- 2. 多通道輸入和單卷積核
- 3. 多通道輸入、多卷積核
- 4. 步長
- 5. 填充
?卷積神經網絡通過充分利用局部相關性和權值共享的思想,大大地減少了網絡的參數量,從而提高訓練效率,更容易實現超大規模的深層網絡。2012年,加拿大多倫多大學Alex Krizhevsky將深層卷積神經網絡應用在大規模圖片識別挑戰賽ILSVRC-2012上,在ImageNet數據集上取得了15.3%的Top-5錯誤率,排名第一,相對于第二名在Top-5錯誤率上降低了10.9% [1],這一巨大突破引起了業界強烈關注,卷積神經網絡迅速成為計算機視覺領域的新寵,隨后在一系列的任務中,基于卷積神經網絡的形形色色的模型相繼被提出,并在原有的性能上取得了巨大提升。
?現在我們來介紹卷積神經層的具體計算流程。以2D圖片為例,卷積層接受高、寬分別為 hhh、 www,通道數為 cinc_{in}cin?的輸入特征圖 X\boldsymbol XX,在 coutc_{out}cout?個高、寬都為 kkk,通道數為 cinc_{in}cin?的卷積核作用下,生成高、寬分別為 h′h'h′、 w′w'w′,通道數為 coutc_{out}cout?的特征圖輸出。需要注意的是,卷積核的高寬可以不等,為了簡化討論,這里僅討論高寬都為 kkk的情況,之后可以輕松推廣到高、寬不等的情況。
?我們首先從單通道輸入、單卷積核的情況開始討論,然后推廣至多通道輸入、單卷積核,最后討論最常用,也是最復雜的多通道輸入、多個卷積核的卷積層實現。
- [1] A. Krizhevsky, I. Sutskever 和 G. E. Hinton, “ImageNet Classification with Deep Convolutional Neural Networks,” 出處 Advances in Neural Information Processing Systems 25, F. Pereira, C. J. C. Burges, L. Bottou 和 K. Q. Weinberger, 編輯, Curran Associates, Inc., 2012, pp. 1097-1105.
1. 單通道輸入和單卷積核
?首先討論單通道輸入cin=1c_{in}=1cin?=1,如灰度圖片只有灰度值一個通道,單個卷積核cout=1c_{out}=1cout?=1的情況。以輸入X\boldsymbol XX為5×55×55×5的矩陣,卷積核為3×33×33×3的矩陣為例,如下圖所示。與卷積核大小相同的感受野(輸入X\boldsymbol XX上方的綠色方框)首先移動至輸入X\boldsymbol XX最左上方,選中輸入X\boldsymbol XX 上3×3的感受野元素,與卷積核(圖片中間3×3方框)對應元素相乘:
[1?10?1?2212?2]⊙[?1121?130?1?2]=[?1?10?1260?24]\begin{bmatrix}1&-1&0\\-1&-2&2\\1&2&-2\end{bmatrix}\odot\begin{bmatrix}-1&1&2\\1&-1&3\\0&-1&-2\end{bmatrix}=\begin{bmatrix}-1&-1&0\\-1&2&6\\0&-2&4\end{bmatrix} ???1?11??1?22?02?2????⊙????110?1?1?1?23?2????=????1?10??12?2?064????
⊙\odot⊙符號表示哈達馬積(Hadamard Product),即矩陣的對應元素相乘,它與矩陣相乘符號@@@是矩陣的兩種最為常見的運算形式。運算后得到3×33×33×3的矩陣,這9個數值全部相加:
?1?1+0?1+2+6+0?2+4=7-1-1+0-1+2+6+0-2+4=7?1?1+0?1+2+6+0?2+4=7
得到標量7,寫入輸出矩陣第一行、第一列的位置,如下圖所示:
?完成第一個感受野區域的特征提取后,感受野窗口向右移動一個步長單位(Strides,記為sss,默認為1),選中下圖中綠色方框中的9個感受野元素,按照同樣的計算方法,與卷積核對應元素相乘累加,得到輸出10,寫入第一行、第二列位置。
?感受野窗口再次向右移動一個步長單位,選中下圖中綠色方框中的元素,并與卷積核相乘累加,得到輸出3,并寫入輸出的第一行、第三列位置。
?此時感受野已經移動至輸入X\boldsymbol XX的有效像素的最右邊,無法向右邊繼續移動(在不填充無效元素的情況下),因此感受野窗口向下移動一個步長單位(s=1s=1s=1),并回到當前行的行首位置,繼續選中新的感受野元素區域,如下圖所示,與卷積核運算得到輸出值-1.此時的感受野由于經過向下移動一個步長單位,因此輸出值-1寫入第二行、第一列位置。
?按照上述方法,每次感受野向右移動s=1s=1s=1個步長單位,若超出輸入邊界,則向下移動s=1s=1s=1個步長單位,并回到行首,直到感受野移動至最右邊、最下方位置,如下圖所示。每次選中的感受野區域元素,和卷積核對應元素相乘累加,并寫入輸出的對應位置。最終輸出我們得到一個3×33×33×3的矩陣,比輸入5×55×55×5略小,這是因為感受野不能超出元素邊界的緣故。可以觀察到,卷積運算的輸出矩陣大小由卷積核的大小kkk,輸入X\boldsymbol XX的高寬h/wh/wh/w,移動步長sss,是否填充等因素共同決定。這里為了演示計算過程,預繪制了一個與輸入等大小的網格,并不表示輸出高寬為5×55×55×5,這里的實際輸出高寬只有3×33×33×3。
?現在我們已經介紹了單通道輸入、單個卷積核的運算流程。實際的神經網絡輸入通道數量往往較多,接下來我們將學習多通道輸入、單個卷積核的卷積運算方法。
2. 多通道輸入和單卷積核
?多通道輸入的卷積更為常見,比如色彩的圖片包含了R/G/B三個通道,每個通道上面的像素值表示R/G/B色彩的強度。下面我們以3通道輸入、單個卷積核為例,將單通道輸入的卷積運算方法推廣到多通道的情況。如下圖所示。每行的最左邊5×5的矩陣表示X\boldsymbol XX的1~31\sim31~3通道,第二列的3×33×33×3矩陣分別表示卷積核的1~31\sim31~3通道,第3列的矩陣表示當前通道上運算結果的中間矩陣,最右邊一個矩陣表示卷積層運算的最終輸出。
?在多通道輸入的情況下,卷積核的通道數需要和輸入X\boldsymbol XX的通道數量相匹配,卷積核的第iii個通道和X\boldsymbol XX的第iii個通道,得到第iii個中間矩陣,此時可以視為單通道輸入與單卷積核的情況,所有通道的中間矩陣對應元素再次相加,作為最終輸出。
?具體的計算流程如下: 在初始狀態,如上圖所示,每個通道上面的感受野窗口同步落在對應通道上面的最左邊、最上方位置,每個通道上感受野區域元素與卷積核對應通道上面的矩陣相乘累加,分別得到三個通道上面的輸出7、-11、-1的中間變量,這些中間變量相加得到輸出-到5,寫入對應位置。
?隨后,感受野窗口同步在X的每個通道上向右移動s=1s=1s=1個步長單位,此時感受野區域元素如下圖所示,每個通道上面的感受野與卷積核對應通道上面的矩陣相乘累加,得到中間變量10、20、20,全部相加得到輸出50,寫入第一行、第二例元素位置。
?以此方式同步移動感受野窗口,直至最右邊、最下方位置,此時全部完成輸入和卷積核的卷積運算,得到3×33×33×3的輸出矩陣,如下圖所示:
?整個的計算示意圖如下圖所示,輸入的每個通道處的感受野均與卷積核的對應通道相乘累加,得到與通道數量相等的中間變量,這些中間變量全部相加即得到當前位置的輸出值。輸入通道的通道數量決定了卷積核的通道數。一個卷積核智能得到一個輸出矩陣,無論輸入X\boldsymbol XX的通道數量。
?一般來說,一個卷積核只能完成某種邏輯的特征提取,當需要同時提取多種邏輯特征時,可以通過增加多個卷積核來得到多種特征,提高神經網絡的表達能力,這就是多通道輸入、多卷積核的情況。
3. 多通道輸入、多卷積核
?多通道輸入、多卷積核是神經網絡中最為常見的形式,前面我們已經介紹了單卷積核的運算過程,每個卷積核和輸入X做卷積運算,得到一個輸出矩陣。當出現多卷積核時,第iii(i∈[1,n]i∈[1,n]i∈[1,n],nnn為卷積核個數)個卷積核與輸入X運算得到第iii個輸出矩陣(也稱為輸出張量O\boldsymbol OO的通道iii),最后全部的輸出矩陣在通道維度上進行拼接(Stack操作,創建輸出通道數的新維度),產生輸出張量O\boldsymbol OO,O\boldsymbol OO包含了nnn個通道數。
?以3通道輸入、2個卷積核的卷積層為例。第一個卷積核與輸入X運算得到輸出O的第一個通道,第二個卷積核與輸入X\boldsymbol XX運算得到輸出O\boldsymbol OO的第二個通道,如下圖所示,輸出的兩個通道拼接在一起形成了最終輸出O\boldsymbol OO。每個卷積核的大小kkk、步長sss、填充設定等都是統一設置,這樣才能保證每個通道大小一致,從而滿足拼接的條件。
4. 步長
?在卷積運算中,如何控制感受野布置的密度呢?對于信息密度較大的輸入,如物體數量很多的圖片,為了盡可能的少漏掉有用信息,在網絡設計的時候希望能夠較密集地布置感受野窗口; 對于信息密度較小的輸入,比如全是海洋的圖片,可以適當地減少感受野窗口的數量。感受野密度的控制手段一般是通過移動步長(Strides)實現的。
?步長是指感受野窗口每次移動的長度單位,對于2D輸入來說,分為沿xxx(向右)方向和yyy(向下)方向的移動長度。為了簡化討論,這里只考慮x/yx/yx/y方向移動步長相同的情況,這也是神經網絡中最常見的設定。如下圖所示,綠色實線代表的感受野窗口的位置是當前位置,綠色虛線代表是上一次感受野所在位置,從上一次位置移動到當前位置的移動長度即是步長的定義。下圖中感受野沿x方向的步長為2,表達為步長s=2s=2s=2。
?當感受野移動至輸入X\boldsymbol XX右邊的邊界時,感受野向下移動一個步長s=2s=2s=2,并回到行首。如下圖所示,感受野向下移動2個單位,并回到行首位置,進行相乘累加運算。
?循環往復移動,直至達到最下方、最右邊邊緣位置,如圖所示,最終卷積層輸出的高寬只有2×22×22×2。對比前面s=1s=1s=1的情形,輸出高寬由3×33×33×3降低為2×22×22×2,感受野的數量減少為僅4個。
?可以看到,通過設定步長sss,可以有效地控制信息密度的提取。當步長設計的較小時,感受野以較小幅度移動窗口,有利于提取到更多的特征信息,輸出張量的尺寸也更大; 當步長設計的較大時,感受野以較大幅度移動窗口,有利于較少計算代價,過濾冗余信息,輸出張量的尺寸也更小。
5. 填充
?經過卷積運算后的輸出O\boldsymbol OO的高寬一般會小于輸入X\boldsymbol XX的高寬,即使是步長s=1s=1s=1時,輸出O\boldsymbol OO的高寬也會略小于輸入X\boldsymbol XX的高寬。在網絡模型設計時,有時希望輸出O\boldsymbol OO的高寬能夠與輸入X\boldsymbol XX的高寬相同,從而方便網絡參數的設計、殘差連接等。為了讓輸出O\boldsymbol OO的高寬能夠與輸入X\boldsymbol XX的相等,一般通過在源輸入X\boldsymbol XX的高和寬維度上面進行填充(Padding)若干無效元素操作,得到增大的輸入X′\boldsymbol X'X′。通過精心設計填充單位的數量,在X′\boldsymbol X'X′上面進行卷積運算得到輸出O\boldsymbol OO的高寬可以和原輸入X\boldsymbol XX相等,甚至更大。
?如下圖所示,在高/行方向上的上(Top)、下(Bottom)方向,寬/列方向的左(Left)、右(Right)均可以進行不定數量的填充操作,填充的數值一般默認為0,也可以填充自定義的數據。下圖中上、下方向各填充1行,左、右方向各填充2列,得到新的輸入X′\boldsymbol X'X′。
?那么添加填充后的卷積層怎么運算呢?同樣的方法,僅僅是把參與運算的輸入從X\boldsymbol XX換成了填充后得到的新張量X′\boldsymbol X'X′。如下圖所示,感受野的初始位置在填充后的X′\boldsymbol X'X′的左上方,完成相乘累加運算,得到輸出1,寫入輸出張量的對應位置。
?移動步長s=1個單位,重復運算邏輯,得到輸出0,如下圖所示:
?循環往復,最終得到5×55×55×5的輸出張量,如下圖所示:
?通過精心設計的Padding方案,即上下左右各填充一個單位,記為p=1p=1p=1,我們可以得到輸出O\boldsymbol OO和輸入X\boldsymbol XX的高、寬相等的結果; 在不加Padding的情況下,如下圖所示,只能得到3×33×33×3的輸出O\boldsymbol OO,略小于輸入X\boldsymbol XX。
?卷積神經層的輸出尺寸[b,h′,w′,cout][b,h',w',c_{out}][b,h′,w′,cout?]由卷積核的數量coutc_{out}cout?,卷積核的大小kkk,步長sss,填充數ppp(只考慮上下填充數量php_hph?相同,左右填充數量pwp_wpw?相同的情況)以及輸入X的高寬h/wh/wh/w共同決定,它們之間的數學關系可以表達為:
h′=?h+2?ph?ks?+1w′=?w+2?pw?ks?+1h'=?\frac{h+2\cdot p_h-k}{s}?+1\\ w'=?\frac{w+2\cdot p_w-k}{s}?+1h′=?sh+2?ph??k??+1w′=?sw+2?pw??k??+1
其中php_hph?、pwp_wpw?分別表示高、寬方向的填充數量,????\cdot????表示向下取整。以上面的例子為例,h=5h=5h=5,k=3k=3k=3,ph=pw=1p_h=p_w=1ph?=pw?=1,s=1s=1s=1,輸出的高寬分別為:
h′=?5+2?1?31?+1=?4?+1=5w′=?5+2?1?31?+1=?4?+1=5h'=?\frac{5+2\cdot1-3}{1}?+1=?4?+1=5\\ w'=?\frac{5+2\cdot1-3}{1}?+1=?4?+1=5h′=?15+2?1?3??+1=?4?+1=5w′=?15+2?1?3??+1=?4?+1=5
?在TensorFlow中,在s=1s=1s=1時,如果希望輸出O\boldsymbol OO和輸入X\boldsymbol XX高、寬相等,只需要簡單地設置參數padding=“SAME”即可使TensorFlow自動計算padding數量,非常方便。
總結
以上是生活随笔為你收集整理的深度学习之卷积神经网络(2)卷积神经网络结构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 法拉第未来:FF 91 Futurist
- 下一篇: 深度学习之卷积神经网络(3)卷积层实现