1.卷積操作實質:
輸入圖像(input volume),在深度方向上由很多slice組成,對於其中一個slice,可以對應很多神經元,神經元的weight表現為卷積核的形式,即一個方形的濾波器(filter)(如3X3),這些神經元各自分別對應圖像中的某一個局部區域(local region),用於提取該區域的特征。如果該slice對應的神經元參數共享,那么相當於只有一個卷積核作用於所有的局部區域(類似於圖像濾波了)。一個局部區域可以稱為一個block,如果將所有的block拉成一個個列向量(因為神經元作用本來就定義為將輸入向量和參數向量進行內積操作,y=w0x0+w1x1+...+wnxn),則我們可以得到很多這些列向量組成的局部區域數據矩陣,再將神經元的weight拉成一個個行向量,這樣就得到一個參數矩陣(如果參數共享,那么該矩陣行數為slice的個數),然后將數據矩陣和參數矩陣進行點積操作,得到卷積后結果,其實就是將所有的filter和所有的局部區域分別進行點積操作,當然這個結果還需要重新reshape到期望的輸出尺寸。這個過程其實也解釋了為什么神經元的參數可以保存在一個個filter中,該網絡層為什么稱為卷積層。
下圖轉自https://www.zhihu.com/question/28385679
最后一頁沒畫,但是基本上就是Filter Matrix乘以Feature Matrix的轉置,得到輸出矩陣Cout x (H x W),就可以解釋為輸出的三維Blob(Cout x H x W)。
2.經過卷積后輸出圖像尺寸:
假設輸入圖像尺寸為W,卷積核尺寸為F,步幅(stride)為S(卷積核移動的步幅),Padding使用P(用於填充輸入圖像的邊界,一般填充0),那么經過該卷積層后輸出的圖像尺寸為(W-F+2P)/S+1。
3.池化
池化層通過減小中間過程產生的特征圖的尺寸(下采樣,圖像深度不變),從而減小參數規模,降低計算復雜度,也可以防止過擬合。池化是分別獨立作用於圖像深度方向上的每個slice,一般使用Max操作(在一個局部區域內取最大值代表該區域),即最大池。通常池化層的空間尺寸(spatial extent)不應過大,過大會丟失太多結構信息,一般取F=3,S=2或者F=2,S=2。也有人不建議使用池化,而是在卷積層增大stride來降低圖像尺寸。
4.全連接
一個神經元作用於整個slice,即filter的尺寸恰好為一個slice的尺寸,這樣輸出一個值,如果有n個filter,則輸出長度為n的向量,一般全連接層的輸出為類別/分數向量(class scores )。
5. 網絡的結構
網絡的一般結構為:
INPUT -> [[CONV -> RELU]*N -> POOL?]*M -> [FC -> RELU]*K -> FC
INPUT:輸入
CONV:卷積層
RELU:激活函數
POOL:池化層,這里的問號表示該層是可選的
FC:全連接層
N >= 0
(通常N <= 3)
, M >= 0
, K >= 0
(通常 K < 3)
6.其他
(1)盡量使用多層fliter尺寸小的卷積層代替一層filter較大的卷積層。
因為使用多層filter較小的卷積層所能觀察到的區域大小和一層filter較大的卷積層是相同的,但是前者可以看到更加抽象的特征,提取的特征表達性能更佳。
此外,前者引入的參數規模相比后者更小。比如,使用3層filter為3X3的卷積層代替1層filter為7X7的卷積層,假設輸入的volume為C個通道,則前者參數
個數為3×(C×(3×3×C))=27C^2,而后者為C×(7×7×C)=49C^2,明顯前者引入的參數更少。
(2)為什么使用padding?
使用padding的好處是使得卷積前后的圖像尺寸保持相同,可以保持邊界的信息。一般padding的大小為P=(F-1)/2,其中F為filter的尺寸。如果不使用
paddding,則要仔細跟蹤圖像尺寸的變化,確保每一層filter和stride正確的被使用。
(3)為什么stride一般設為1?
stride設為1實際表現效果更好,將下采樣的工作全部交給池化層。
(4)輸入層(input layer)尺寸一般應該能被2整除很多次,比如32(CIFAR-10),64,96(STL-10),224(common ImageNet ConvNets),384和512。
(5)盡量使用filter較小(3x3 or 至多 5x5)的卷積層,如果要使用較大的filter(比如7x7),一般也只在第一個卷積層。
(6)有時候由於參數太多,內存限制,會在第一個卷積層使用較大filter(7x7)和stride(2)(參考 ZF Net),或者filter(11x11),stride(4)
(參考 AlexNet)。