標籤:partial 成員 簡潔 轉換函式 display play 資訊 輸入資料 分塊
在之前的博文中我們著重分析了convolutional_layer類的代碼結構。在這篇博文中分析相應的下採樣層average_pooling_layer類:
一、下採樣層的作用
下採樣層的作用理論上來說由兩個,主要是降維,其次是提高一點特徵的魯棒性。在LeNet-5模型中。每一個卷積層後面都跟著一個下採樣層:
原因就是當映像在經過卷積層之後。因為每一個卷積層都有多個卷積模板,直接導致卷積結果輸出的特徵矩陣相對於輸入的資料矩陣其維數要提高數倍。再加上存在若干卷積層(Google的某些模型甚至超過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層結構類分析