1. 程式人生 > >C++卷積神經網路例項:tiny_cnn程式碼詳解(6)——average_pooling_layer層結構類分析

C++卷積神經網路例項:tiny_cnn程式碼詳解(6)——average_pooling_layer層結構類分析

  在之前的博文中我們著重分析了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卡是不夠用的。

如果覺得這篇文章對您有所啟發,歡迎關注我的公眾號,我會盡可能積極和大家交流,謝謝。