卷積神經網絡在分類層用卷積層代替全連接層的好處(附代碼演示)

先說一下結論:

好處:可以讓卷積神經網絡模型的訓練集和測試集的圖像大小不一樣,如果是全連接層則必須輸入圖像的大小一致

分析過程:

全連接層—代碼演示具體操作

假設batch-size是1,最後的卷積層輸出大小是5X5,通道數是512的話,如果接全連接層的話,就需要先reshape成一維的,這裏的dim=12800(5X5X512),這裏全連接層的權重矩陣大小就固定爲了[12800,256](全連接層有256個神經元)。如果訓練集和測試集中的圖像大小不一樣,就會導致卷積層的輸出大小不一樣,從而reshape後就不是12800了,使得無法和權重矩陣相乘,就會報錯。所以如果是用全連接層的話,那麼訓練集和測試集輸入模型的圖像大小必須一致。

卷積層代替全連接層—代碼演示具體操作

通常這種做法是用全局池化(global_pool)和1X1的卷積核實現的,全局池化是不需要設置filter,無論特徵圖多大都只保留一個。假設batch-size是1,最後的卷積層輸出大小是5X5,通道數是512,那麼接一個全局池化後卷積層的輸出就從5X5,變成了1X1(這也是一種正則化的手段),通道數還是512。這個1X1X512的矩陣和1X1的卷積核做卷積運算,其效果就等於全連接層,但是由於全局池化的存在,所以可以不固定輸入模型的圖像大小,因爲最後全局池化後都會是1X1。這樣就可以讓訓練集和測試集輸入模型的圖像大小不一致。

代碼是通過reduce_mean實現全局池化,[1,2]是表示在圖像的高度和寬度這兩個維度。(如果是[1,2,3]就表示在圖像的高度、寬度和通道數這三個維度)。

題外話:

下圖代碼是谷歌公司實現GoogleNet網絡的分類層

代碼也是池化+1X1卷積層的思想來作爲全連接層,但是用的是傳統池化層而不是全局池化,之所以池化層的filter大小是7X7,是因爲上一層的卷積層輸出的大小是7X7X1024,所以本質上效果等於全局池化,池化完的大小就是1X1X1024。不過這樣的寫法就導致GoogleNet的圖像輸入大小是固定的,只能是224X224,纔會正好使最後一個卷積層的高度和寬度都是7。

致謝:AIZOO的指導讓我比以前理解的更透徹了。感謝AIZOO的元峯,推薦關注他的公衆號AIZOO,一個分享AI技術和資訊的好地方。 主頁鏈接:https://aizoo.com/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章