1. 程式人生 > >C++卷積神經網絡實例:tiny_cnn代碼具體解釋(6)——average_pooling_layer層結構類分析

C++卷積神經網絡實例:tiny_cnn代碼具體解釋(6)——average_pooling_layer層結構類分析

加權 for com 整數 ret 子類 mismatch normal 信息

  在之前的博文中我們著重分析了convolutional_layer類的代碼結構。在這篇博文中分析相應的下採樣層average_pooling_layer類:

技術分享

  一、下採樣層的作用

  下採樣層的作用理論上來說由兩個,主要是降維,其次是提高一點特征的魯棒性。在LeNet-5模型中。每一個卷積層後面都跟著一個下採樣層:

技術分享

  原因就是當圖像在經過卷積層之後。因為每一個卷積層都有多個卷積模板,直接導致卷積結果輸出的特征矩陣相對於輸入的數據矩陣其維數要提高數倍。再加上存在若幹卷積層(谷歌的某些模型甚至超過100層),若不進行降維操作。最後的特征維數可想而知,因此在這裏下採樣層就充當了一個特征降維的角色。比方這裏用的是2*2模板均值下採樣,說白了就是四個相鄰像素經過加權計算變成一個,維數變為原來的四分之中的一個,降維性能顯而易見。

至於魯棒性問題,理論上僅僅要是合理的降維手段。對魯棒性都會有一定的提升(當然這是我的個人觀點)。

  二、average_pooling_layer類結構

  average_pooling_layer類相同繼承自基類partial_connected_layer,和前文中所說的convolutional_layer類算是相同繼承層次,因此與convolutional_layer類在結構上也很類似,但下採樣層因為其功能相對單一,因此在結構上比convolutional_layer類要簡潔不少

  2.1 成員變量

  average_pooling_layer類的成員變量一共同擁有兩個,分別保存輸入數據矩陣的屬性和下採樣後輸出特征矩陣的屬性:

技術分享

  至於有關layer_size_t、index3d等類型的相關知識在上一篇博客中已經進行了具體介紹,這裏不再贅述。

  2.2 構造函數

  average_pooling_layer類的構造函數十分簡潔,基本上就是調用了基類partial_connected_layer的構造函數,然後在完畢自己類中兩個成員變量的初始化而已:

技術分享

  這裏稍稍介紹一下pooling_size_mismatch()函數。這是一個定義在基類layer中的函數,作用就是拋出尺寸異常的信息,而在每一層中對尺寸匹配的檢驗標準都不同。因此各個子類在調用這個函數給出異常信息時,須要根據相應層的標準來進行推斷,比方在下採樣層,我們覺得假設輸入數據矩陣的尺寸不是下採樣窗體的整數倍時,則無法正常進行分塊降維,即視為尺寸不匹配。拋出尺寸異常信息:

技術分享

  2.3 其它函數

  除了構造函數,下採樣層還提供了一些其它函數,包含下採樣矩陣權重初始化函數和偏置初始化函數(在下採樣的過程中相同須要加上偏置)init_connection(),權重矩陣設置函數connect_kernel(),以及輸出特征矩陣圖像化的轉換函數output_to_image()。以上這些函數與前一篇博文中convolutional_layer類中的相應的函數功能能夠說是全然相同(畢竟都是繼承與同一個基類)。這裏不再贅述。

  三、註意事項

  1、下採樣層後的激活函數

  在實際的卷積神經網絡模型中,對卷積特征輸出進行下採樣之後,緊接著應該送入激活函數中,換句話說下採樣層和激活函數應該是緊密相關的。只是在這裏作者並沒有將激活函數直接放在average_pooling_layer類中,而是將每一個激活函數都封裝成相應的類,並放到activation命名空間下:

技術分享

  2、LeNet-5模型的經典性

  這裏在介紹卷積伸神經網絡模型時一直沿用LeNet-5模型,主要是因為它既結構簡單又堪稱CNN的經典之作,但在實際應用中卷積神經網絡的層數可不止這些。舉個樣例,2014年的VGG模型已經將網絡擴展到16層的深度,至於各大深度學習研究院內部已經將網絡加深到多少層這個已經不得而知。總之中的一個兩塊泰坦級別的N卡是不夠用的。

C++卷積神經網絡實例:tiny_cnn代碼具體解釋(6)——average_pooling_layer層結構類分析