在卷積神經網路中,我們經常會碰到池化操作,而池化層往往在卷積層後面,通過池化來降低卷積層輸出的特徵向量,同時改善結果(不易出現過擬合)。
為什麼可以通過降低維度呢?
因為影象具有一種「靜態性」的屬性,這也就意味著在乙個影象區域有用的特徵極有可能在另乙個區域同樣適用。因此,為了描述大的影象,乙個很自然的想法就是對不同位置的特徵進行聚合統計,例如,人們可以計算影象乙個區域上的某個特定特徵的平均值 (或最大值)來代表這個區域的特徵。[1]
池化作用於影象中不重合的區域(這與卷積操作不同),過程如下圖。
我們定義池化視窗的大小為sizex,即下圖中紅色正方形的邊長,定義兩個相鄰池化視窗的水平位移/豎直位移為stride。一般池化由於每一池化視窗都是不重複的,所以sizex=stride。
最常見的池化操作為平均池化mean pooling和最大池化max pooling:
平均池化:計算影象區域的平均值作為該區域池化後的值。
最大池化:選影象區域的最大值作為該區域池化後的值。
隨機池化:只需對feature map中的元素按照其概率值大小隨機選擇,即元素值大的被選中的概率也大
隨機池化理解,**:
補充(**:
在提取資訊的時候,在池化的時候,如果取區域均值(mean-pooling),往往能保留整體資料的特徵,能凸出背景的資訊,而如果取區域最大值(max-pooling),則能更好保留紋理上的特徵,但這些應該都不如小波變換那樣,可以保留更多的細節特徵,整體上也應該更加細微。
在iclr2013上,zeiler提出了stochastic pooling,元素值大的被選中的概率也大,但不是像max-pooling那樣總是取最大值,這種方法的優勢是,一方面最大化保證了max值的取值,一方面又部分確保不會所有元素都被max值給忽悠住,造成過度失真。
這種方式想來還是有缺陷的,因為這種隨機行挑選儘管有概率傾向,但它是人為疊加上的,無法總是保證一定隨機的概率選擇中能夠選擇到更好的結果,所以也會出現更糟糕的結果的時候,不過加入概率演算法好處是,它為產生更好的結果產生了可能,所以總的來說,還是有可能得到更好的結果的。
假設目標總是容易被命中的,而有那麼個正態分佈與目標的分布是近似重合的,如何保證這種分布比較能吻合目標?平均值與最大值都會產生偏移,因為畢竟太暴力了,而概率演算法加入無疑是比較理想的,能減少這種偏移的可能,如果運氣足夠好,收斂會非常好,那麼還有可能得到更加貼近的結果,於是這個又扯到了運氣上來了。
只是,術數里的收斂為何能那麼準確,這個從數學角度實在是難解,究竟是什麼沒有考慮到?目前有一種隱隱地思路,需要探索以術數的模型套上去,只是還是沒有找到橋梁在**,第一是要找出,資訊是如何演算並摺疊在卦中的,第二是要找出如何還能夠把資訊進行還原。
在嘗試計算了近十萬個圖形與隨機起卦之間的聯絡後,發現要建立這個聯絡,是極難完成的任務,製作自動編碼器運算到一定程度收斂越來越慢,隨便估計也是要花上個幾個月的(還不一定最後算得出來),想來還是思路有問題。
重疊池化正如其名字所說的,相鄰池化視窗之間會有重疊區域,此時sizex>stride。
**中[2]中,作者使用了重疊池化,其他的設定都不變的情況下, top-1和top-5 的錯誤率分別減少了0.4% 和0.3%。
空間金字塔池化可以把任何尺度的影象的卷積特徵轉化成相同維度,這不僅可以讓cnn處理任意尺度的影象,還能避免cropping和warping操作,導致一些資訊的丟失,具有非常重要的意義。
一般的cnn都需要輸入影象的大小是固定的,這是因為全連線層的輸入需要固定輸入維度,但在卷積操作是沒有對影象尺度有限制,所有作者提出了空間金字塔池化,先讓影象進行卷積操作,然後轉化成維度相同的特徵輸入到全連線層,這個可以把cnn擴充套件到任意大小的影象。
空間金字塔池化的思想來自於spatial pyramid model,它乙個pooling變成了多個scale的pooling。用不同大小池化視窗作用於卷積特徵,我們可以得到1x1,2x2,4x4的池化結果,由於conv5中共有256個過濾器,所以得到1個256維的特徵,4個256個特徵,以及16個256維的特徵,然後把這21個256維特徵鏈結起來輸入全連線層,通過這種方式把不同大小的影象轉化成相同維度的特徵。
對於不同的影象要得到相同大小的pooling結果,就需要根據影象的大小動態的計算池化視窗的大小和步長。假設conv5輸出的大小為a*a,需要得到n*n大小的池化結果,可以讓視窗大小sizex為
疑問:如果conv5輸出的大小為14*14,[pool1*1]的sizex=stride=14,[pool2*2]的sizex=stride=7,這些都沒有問題,但是,[pool4*4]的sizex=5,stride=4,最後一列和最後一行特徵沒有被池化操作計算在內。
spp其實就是一種多個scale的pooling,可以獲取影象中的多尺度資訊;在cnn中加入spp後,可以讓cnn處理任意大小的輸入,這讓模型變得更加的flexible。
4. reference
[1] ufldl_tutorial
[2] krizhevsky, i. sutskever, andg. hinton, 「imagenet classification with deep convolutional neural networks,」in nips,2012.
[3] kaiming he, xiangyu zhang, shaoqing ren, jian su,spatial pyramid pooling in deep convolutional networks for visual recognition,lsvrc-2014 contest
卷積池化計算 深度學習
卷積後輸出大小 w 影象寬,h 影象高,d 影象深度 通道數 f 卷積核寬高,n 卷積核 過濾器 個數 s 步長,p 用零填充個數 卷積後輸出影象大小 width w f 2p s 1 height h f 2p s 1 卷積後輸出影象深度 d n 輸出影象大小 width,height,n wei...
深度學習之最大池化操作的實現
在darknet框架中 c語言實現 max pooling實現方式如下 void forward maxpool layer const maxpool layer l,network net l.output out index max l.indexes out index max i 其中,函...
深度學習卷積及池化層大小計算
對於初學者,看到這個公式的唯一疑問是 p值到底是多少?在tensoflow中,padding有2個選型,same 和 valid 下面舉例說明差別 如果 padding same 輸出尺寸為 w s mport tensorflow as tf input image tf.layers.input...