深度卷積神經網絡學習筆記(一)


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 >= 0K >= 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)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM