2012CNN 論文中所提出的網路結構,為什麼前兩個卷積有pooling層,而後邊的三個卷積層都沒有?

最近在看2012年論文ImageNet Classification with Deep Convolutional Neural Networks。對於裡面有兩點不明白,希望知道的幫我回答一下。

(1)關於數據的問題

在論文的2 The Dataset 裡面講到由於ImageNet的images的圖像解析度不同,而文章所用的CNN的輸入需要是同一解析度的,So,作者將所有images的解析度固定為256*256。那為什麼在文章 3.5 overall Architecture中網路結構的輸入是224*224*3 ??

(2)關於網路結構

文章中提到網路結構分為8層,前5層為卷積層,後3層為全連接層。問:前5層網路中,為什麼只有前兩層有pooling層,而後邊的卷積沒有進行pooling?


pooling是一種信息彙集信息粗粒度化。就像你說你住廈門市,但我知道你在中國的東南部就夠解決我的問題了一樣。

反過來說,如果信息不需要再粗粒度化,我就要這麼多細節,就不pooling了嘛。


conv後面不一定要有pooling。

像VGG這樣的結構,都會在很多個conv之後才加一個pooling。

ResNet就更不用說了,152層裡面總共就三四個pooling吧?

pooling只是用來減小feature map的大小的,他可能其實並不那麼必要。有的研究表明用stride大於1的conv來代替pooling其實效果一樣的。我自己做過的實驗也印證這個結論。


對於第一個問題:

原本是256x256的,為什麼變成224x224了,其實真正訓練的時候是這樣的,在一個256X256的圖片當中,演算法會隨機的沿著x軸或者Y軸隨機的偏移,取224*224的像素,這樣的data agumentation會增加一定的精確度

第二個問題:

論文裡面倒是沒有具體對於maxpooling的數量進行特別的說明,只是說了max-pooling效果好,可以有一定的效果取增加精度,我猜測正好三層(仔細看一下最後一個卷積後面還有一層)是因為實驗弄出來的吧....


第一個問題,其實輸入應該是227*227,否則那個55*55的feature map是有問題的。


(1)關於數據的問題

在論文的2 The Dataset 裡面講到由於ImageNet的images的圖像解析度不同,而文章所用的CNN的輸入需要是同一解析度的,So,作者將所有images的解析度固定為256*256。那為什麼在文章 3.5 overall Architecture中網路結構的輸入是224*224*3 ??

為了加快數據從硬碟讀進內存的速度,事先把所有大圖片的解析度都壓縮到256*256,這些小圖保存在本地。

正式訓練時,圖片讀進內存之後,送進網路之前,隨機截取其中的227*227,使圖片的主題得以保留(即label不變)的同時,增加了數據的多樣性,這個技巧叫做data augmentation. (其他的data augmentation例子:給圖片加各種濾鏡)

原文中寫的224*224是作者的一個小miss,結果後來的VGG,GoogLeNet,ResNet全都用了224*224這個尺寸作為輸入了233333

當然根本原因是後來有名的網路結構都不使用卷積層來改變圖像的尺寸了(我一直覺得這是因為大家都嫌這種設計很麻煩。有不同見解的請指出)——只通過Pooling來實現降採樣,這種情況下用224*224就很讓人滿意,因為224 -&> 112 -&> 56 -&> 28 -&> 14 -&> 7 可以支持5次Pooling。

(2)關於網路結構

文章中提到網路結構分為8層,前5層為卷積層,後3層為全連接層。問:前5層網路中,為什麼只有前兩層有pooling層,而後邊的卷積沒有進行pooling?

為了講清楚這個問題,首先必須講下我們為什麼要使用Pooling (默認為2*2, step=2)。

  1. 提供位移不變性(translation invariance),提供了更稠密的特徵圖,現在同一個物體在圖像中的不同位置都能被檢測出來了,可以控制過擬合。
  2. 減少後面的內存使用量和計算量,下一層的輸入尺寸變成了原來的1/4,所以內存佔用量少了,計算也快了。
  3. 擴大感受野(receptive field),一個卷積核的感受野,是指它能「看得到」的原圖中的範圍,一個卷積核的感受野越大,它就能獲取越全局的特徵(對深度尤為重要)。

具體講一下感受野。拿VGG來舉例子,第一層3*3卷積操作(Conv1_1),所以第一層的感受野大小就是3*3。第二層還是3*3卷積操作(Conv1_2),所以第二層的感受野是5*5。然後接一層2*2的池化(Pool1),感受野是6*6,如下圖:

到這裡都很好理解。接下來是重點!看下圖,在Pool1的特徵圖上進行3*3卷積(Conv2_1),感受野一下子變成了10*10!然後下一層卷積(Conv2_2)的感受野大小是14*14!感受野的範圍的增長速度變快了!

後面的幾層conv和pool層的感受野大小總結成列表了:

可以看到每次池化(Pooling)之後,感受野的增加速度都會翻倍。還記得嗎?VGG16的輸入尺寸是224*224,最後一層感受野212*212。這個結構可不是拍腦袋隨便拍出來的……

回到題主的問題,網路的後面不使用Pooling的原因大概就是:

  • 特徵圖已經很小了,比如7*7
  • 感受野已經夠大了

各位要是有興趣可以自行計算下別的網路結構下每一層的感受野大小。

比如Res152。


1.這個從原理上也好理解。 Pooling實際上也可以當做一種尺度縮放。 後面的時候,圖像其實已經很小了。再做pooling效果不會好。一個人不停的pooliing最後和米粒區別不大就沒意義了。

2.如前各位層主所述。這個網路當時作者其實還是做了不少實驗才調節好的參數。這裡面有很多實驗的經驗和感覺。解釋不清。 有些做法,比如分組卷積,也是作者設備不支持下的無奈之舉。

建議可以看看作者的公開視頻課,裡面可發現一些細節。


推薦閱讀:

6年資料庫核心開發 是否 該轉行機器學習/人工智慧?
做NLP演算法工程師是一種什麼樣的體驗,以及日常工作是什麼?
tf.data是如何支持多線程的?為何會比基於queue的batch方案慢4到5倍?
data scientist 有什麼常見 machine learning 相關的面試問題?
將來用人工智慧管理網民是否可行?

TAG:人工智慧 | 機器學習 | 深度學習DeepLearning | 卷積神經網路CNN |