卷積神經網絡中關於全連接層效果、參數計算等的一些思考

一、引發思考的實驗與問題:

在一個非常小的二分類樣本集(樣本總數目63,“10-crop”法數據增強10倍,樣本爲矩陣保存爲圖片),通過ALexNet模型和VGG模型做分類任務,無論怎麼調超參數,留出法重複50次的實驗情況大致都如圖A所示,而用Inception_v1的效果可以達到如圖B所示。我就很奇怪爲什麼效果會差別這麼大?按道理就算inception_v1模型有多尺度(並聯卷積層)的設計思想,準確率和AUC的值是會提升,但不會提升這麼多,而且在訓練集的效果差距也太大了。

                              

爲了研究這個問題,我首先嚐試了自己寫的同一個讀取數據顯示結果的程序,確保自變量因素只有模型本身,而不是一些程序bug導致的。根據圖A的結果,訓練集的效果也比較差,所以我推斷爲模型欠擬合了,繼而推測是模型不夠複雜,無法擬合這種特殊的矩陣圖片樣本,於是我以VGG模型爲基礎,開始各種嘗試增加模型的複雜度,如增加捲積層的數目、卷積核的個數、甚至卷積核的大小等等,但是收效甚微。

這時,我不禁問我自己,難道真的就是卷積核並聯的思想讓模型的效果提升這麼顯著嗎?我不信,於是開始了我的更仔細的對照試驗——我把Inception_v1的模型的並聯卷積層代碼刪掉,只保留每個並聯卷積層中卷積核個數最多的層,形成串聯的卷積層,這句話可能不太好理解,具體可以看下圖的代碼示例:圖A是原始的並聯卷積層代碼,圖B是刪改後的卷積層代碼,只保留了branch1這個分支,如示意圖刪除了三個並聯的分支結構,只保留了一個分支結構,形成傳統卷積神經網絡(卷積、池化串聯的這種結構)。這樣就能看之前實驗效果的顯著提升是不是由並聯卷積層導致的。

實驗結果:修改後模型的效果如下圖所示,確實比Inception_v1模型有下降,但整體效果還是好於ALexNet、VGG模型,這說明之前帶來顯著影響的並不是前面的卷積層,而是後面的分類層

                                                         

二、分析實驗現象與思考

重點來了!

AlexNet和VGG模型最後都是有三個全連接層(FC),而Inception_v1用全局平均池化的方法代替全連接層融合學到的深度特徵這種方法可以顯著提升在小樣本情況下模型的預測分類能力!只有一個分類的全連接層(我是二分類問題,所以只有2個神經元)。

全連接層最大特點是參數爆炸!這裏我們來複習一下卷積層和全連接層的參數計算:

卷積層:假設輸入這個卷積層的圖像大小是224*224*3,這個卷積層的卷積核大小是3*3,步長爲2,個數爲64,記住卷積層的參數個數與輸入圖片的大小無關,計算公式——(卷積核高 * 卷積核寬 * 輸入圖片的通道數 + 1) * 卷積核個數  (+1是因爲bias偏置的存在)

所以這個卷積層的參數爲 (3*3*3+1)* 64 = 1792

全連接層: 計算公式——(上一層神經元個數 + 1) *  當前層神經元個數(+1同樣是因爲bias偏置的存在),舉例說明,一張圖片經過卷積層和池化層處理變成7*7*256,輸入的全連接層有512個神經元,那麼這個全連接層的參數爲:7*7*256*512=6422528;然後下一個全連接層的神經元個數爲1024的話,下一個全連接層的參數爲:512*1024=524288;

初步思考結論:

可以看出全連接層存在參數爆炸與冗餘的情況,之前實驗效果太差很有很可能是因爲有3個全連接層的原因,我做了一個補充實驗,把Inception_v1改爲了3個全連接層,模型效果立刻顯著下載,進一步證明了用全局平均池化減少全連接層的使用可以提升CNN的性能

用全局池化和卷積層方法實現全連接層的好處在我之前的一篇博客有介紹https://blog.csdn.net/Amigo_1997/article/details/104491793

複習:圖像(feature map)經過卷積層的大小變化

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