請問CNN 中的 maxpool 到底是什麼原理,為什麼要取最大值,取最大值的原理是什麼?謝謝。

如題,現在在進行cnn的研究,本人菜鳥一枚,才疏學淺,在進行pool編碼時不是很理解maxpool取鄰域最大值的原理,是最大值能夠代表這一區域的特徵嗎還是怎麼回事。另外除了mean和max之外還有什麼pool的方法,目前比較流行或是說池化效果比較好的pool還有那些方法。謝謝。


Max pooling

在卷積後還會有一個pooling的操作,儘管有其他的比如average pooling等,這裡只提max pooling。

max pooling的操作如下圖所示:整個圖片被不重疊的分割成若干個同樣大小的小塊(pooling size)。每個小塊內只取最大的數字,再捨棄其他節點後,保持原有的平面結構得出output。

[from]

max pooling在不同的depth上是分開執行的,且不需要參數控制。 那麼問題就max pooling有什麼作用?部分信息被捨棄後難道沒有影響嗎?

[from]

Max pooling的主要功能是downsampling,卻不會損壞識別結果。 這意味著卷積後的Feature Map中有對於識別物體不必要的冗餘信息。 那麼我們就反過來思考,這些「冗餘」信息是如何產生的。

直覺上,我們為了探測到某個特定形狀的存在,用一個filter對整個圖片進行逐步掃描。但只有出現了該特定形狀的區域所卷積獲得的輸出才是真正有用的,用該filter卷積其他區域得出的數值就可能對該形狀是否存在的判定影響較小。 比如下圖中,我們還是考慮探測「橫折」這個形狀。 卷積後得到3x3的Feature Map中,真正有用的就是數字為3的那個節點,其餘數值對於這個任務而言都是無關的。 所以用3x3的Max pooling後,並沒有對「橫折」的探測產生影響。 試想在這裡例子中如果不使用Max pooling,而讓網路自己去學習。 網路也會去學習與Max pooling近似效果的權重。因為是近似效果,增加了更多的parameters的代價,卻還不如直接進行Max pooling。

Max pooling還有類似「選擇句」的功能。假如有兩個節點,其中第一個節點會在某些輸入情況下最大,那麼網路就只在這個節點上流通信息;而另一些輸入又會讓第二個節點的值最大,那麼網路就轉而走這個節點的分支。

但是Max pooling也有不好的地方。因為並非所有的抓取都像上圖這樣的極端例子。有些周邊信息對某個概念是否存在的判定也有影響。 並且Max pooling是對所有的Feature Maps進行等價的操作。就好比用相同網孔的漁網打魚,一定會有漏網之魚。

來自YJango的卷積神經網路--介紹 - 知乎專欄


關於pooling的原理, @YJango 以及 @nia nia 已經做了比較好的解釋,小白菜就對題主所問的其他的pooling方法做一個簡單的整理(前一段時間整理的個人覺得比較不錯且流行的pooling方法),下面內容摘自小白擦的博文圖像檢索:layer選擇與fine-tuning性能提升驗證

SUM pooling

基於SUM pooling的中層特徵表示方法,指的是針對中間層的任意一個channel(比如VGGNet16, pool5有512個channel),將該channel的feature map的所有像素值求和,這樣每一個channel得到一個實數值,N個channel最終會得到一個長度為N的向量,該向量即為SUM pooling的結果。

AVE pooling

AVE pooling就是average pooling,本質上它跟SUM pooling是一樣的,只不過是將像素值求和後還除以了feature map的尺寸。小白菜以為,AVE pooling可以帶來一定意義上的平滑,可以減小圖像尺寸變化的干擾。設想一張224224的圖像,將其resize到448448後,分別採用SUM pooling和AVE pooling對這兩張圖像提取特徵,我們猜測的結果是,SUM pooling計算出來的餘弦相似度相比於AVE pooling算出來的應該更小,也就是AVE pooling應該稍微優於SUM pooling一些。

MAX pooling

MAX pooling指的是對於每一個channel(假設有N個channel),將該channel的feature map的像素值選取其中最大值作為該channel的代表,從而得到一個N維向量表示。小白菜在flask-keras-cnn-image-retrieval中採用的正是MAX pooling的方式。

from Day 2 Lecture 6 Content-based Image Retrieval

上面所總結的SUM pooling、AVE pooling以及MAX pooling,這三種pooling方式,在小白菜做過的實驗中,MAX pooling要稍微優於SUM pooling、AVE pooling。不過這三種方式的pooling對於object retrieval的提升仍然有限。

MOP pooling

MOP Pooling源自Multi-scale Orderless Pooling of Deep Convolutional Activation Features這篇文章,一作是Yunchao Gong,此前在搞哈希的時候,讀過他的一些論文,其中比較都代表性的論文是ITQ,小白菜還專門寫過一篇筆記論文閱讀:Iterative Quantization迭代量化。MOP pooling的基本思想是多尺度與VLAD(VLAD原理可以參考小白菜之前寫的博文圖像檢索:BoF、VLAD、FV三劍客),其具體的pooling步驟如下:

from Multi-scale Orderless Pooling of Deep Convolutional Activation Features
Overview of multi-scale orderless pooling for CNN activations (MOP-CNN). Our proposed feature is a concatenation of the feature vectors from three levels: (a)Level 1, corresponding to the 4096-dimensional CNN activation for the entire 256256image; (b) Level 2, formed by extracting activations from 128128 patches and VLADpooling them with a codebook of 100 centers; (c) Level 3, formed in the same way aslevel 2 but with 64*64 patches.

具體地,在L=1的尺度下,也就是全圖,直接resize到256*256的大小,然後送進網路,得到第七層全連接層4096維的特徵;在L=2時,使用128*128(步長為32)的窗口進行滑窗,由於網路的圖像輸入最小尺寸是256*256,所以作者將其上採樣到256256,這樣可以得到很多的局部特徵,然後對其進行VLAD編碼,其中聚類中心設置為100,4096維的特徵降到了500維,這樣便得到了50000維的特徵,然後將這50000維的特徵再降維得到4096維的特徵;L=3的處理過程與L=2的處理過程一樣,只不過窗口的大小編程了64*64的大小。

作者通過實驗論證了MOP pooling這種方式得到的特徵一定的不變性。基於這種MOP pooling小白菜並沒有做過具體的實驗,所以實驗效果只能參考論文本身了。

CROW pooling

對於Object Retrieval,在使用CNN提取特徵的時候,我們所希望的是在有物體的區域進行特徵提取,就像提取局部特徵比如SIFT特徵構BoW、VLAD、FV向量的時候,可以採用MSER、Saliency等手段將SIFT特徵限制在有物體的區域。同樣基於這樣一種思路,在採用CNN做Object Retrieval的時候,我們有兩種方式來更細化Object Retrieval的特徵:一種是先做物體檢測然後在檢測到的物體區域裡面提取CNN特徵;另一種方式是我們通過某種權重自適應的方式,加大有物體區域的權重,而減小非物體區域的權重。CROW pooling ( Cross-dimensional Weighting for Aggregated Deep Convolutional Features )即是採用的後一種方法,通過構建Spatial權重和Channel權重,CROW pooling能夠在一定程度上加大感興趣區域的權重,降低非物體區域的權重。其具體的特徵表示構建過程如下圖所示:

其核心的過程是Spatial Weight和Channel Weight兩個權重。Spatial Weight具體在計算的時候,是直接對每個channel的feature map求和相加,這個Spatial Weight其實可以理解為saliency map。我們知道,通過卷積濾波,響應強的地方一般都是物體的邊緣等,因而將多個通道相加求和後,那些非零且響應大的區域,也一般都是物體所在的區域,因而我們可以將它作為feature map的權重。Channel Weight借用了IDF權重的思想,即對於一些高頻的單詞,比如「the」,這類詞出現的頻率非常大,但是它對於信息的表達其實是沒多大用處的,也就是它包含的信息量太少了,因此在BoW模型中,這類停用詞需要降低它們的權重。借用到Channel Weight的計算過程中,我們可以想像這樣一種情況,比如某一個channel,其feature map每個像素值都是非零的,且都比較大,從視覺上看上去,白色區域佔據了整個feature map,我們可以想到,這個channel的feature map是不利於我們去定位物體的區域的,因此我們需要降低這個channel的權重,而對於白色區域佔feature map面積很小的channel,我們認為它對於定位物體包含有很大的信息,因此應該加大這種channel的權重。而這一現象跟IDF的思想特別吻合,所以作者採用了IDF這一權重定義了Channel Weight。

總體來說,這個Spatial Weight和Channel Weight的設計還是非常巧妙的,不過這樣一種pooling的方式只能在一定程度上契合感興趣區域,我們可以看一下Spatial Weight*Channel Weight的熱力圖:

從上面可以看到,權重大的部分主要在塔尖部分,這一部分可以認為是discriminate區域,當然我們還可以看到,在圖像的其他區域,還有一些比較大的權重分布,這些區域是我們不想要的。當然,從小白菜可視化了一些其他的圖片來看,這種crow pooling方式並不總是成功的,也存在著一些圖片,其權重大的區域並不是圖像中物體的主體。不過,從千萬級圖庫上跑出來的結果來看,crow pooling這種方式還是可以取得不錯的效果。

RMAC pooling

RMAC pooling的池化方式源自於Particular object retrieval with integral max-pooling of CNN activations,三作是Hervé Jégou(和Matthijs Douze是好基友)。在這篇文章中,作者提出來了一種RMAC pooling的池化方式,其主要的思想還是跟上面講過的MOP pooling類似,採用的是一種變窗口的方式進行滑窗,只不過在滑窗的時候,不是在圖像上進行滑窗,而是在feature map上進行的(極大的加快了特徵提取速度),此外在合併local特徵的時候,MOP pooling採用的是VLAD的方式進行合併的,而RMAC pooling則處理得更簡單(簡單並不代表效果不好),直接將local特徵相加得到最終的global特徵。其具體的滑窗方式如下圖所示:

from Day 2 Lecture 6 Content-based Image Retrieval

圖中示意的是三種窗口大小,圖中『x』代表的是窗口的中心,對於每一個窗口的feature map,論文中採用的是MAX pooling的方式,在L=3時,也就是採用圖中所示的三種窗口大小,我們可以得到20個local特徵,此外,我們對整個fature map做一次MAX pooling會得到一個global特徵,這樣對於一幅圖像,我們可以得到21個local特徵(如果把得到的global特徵也視為local的話),這21個local特徵直接相加求和,即得到最終全局的global特徵。論文中作者對比了滑動窗口數量對mAP的影響,從L=1到L=3,mAP是逐步提升的,但是在L=4時,mAP不再提升了。實際上RMAC pooling中設計的窗口的作用是定位物體位置的(CROW pooling通過權重圖定位物體位置)。如上圖所示,在窗口與窗口之間,都是一定的overlap,而最終在構成global特徵的時候,是採用求和相加的方式,因此可以看到,那些重疊的區域我們可以認為是給予了較大的權重。

上面說到的20個local特徵和1個global特徵,採用的是直接合併相加的方式,當然我們還可以把這20個local特徵相加後再跟剩下的那一個global特徵串接起來。實際實驗的時候,發現串接起來的方式比前一種方式有2%-3%的提升。在規模100萬的圖庫上測試,RMAC pooling能夠取得不錯的效果,跟Crow pooling相比,兩者差別不大。

上面總結了6中不同的pooling方式,當然還有很多的pooling方式沒涵蓋不到,在實際應用的時候,小白菜比較推薦採用RMAC pooling和CROW pooling的方式,主要是這兩種pooling方式效果比較好,計算複雜度也比較低。


目前來講並沒有什麼原理。Max pooling的發明本身就是依賴直覺的——如果我們只關心這個區域是不是存在某個特徵,取max就能代表了。為了進一步強化這個直覺,實際中應用比較廣泛的都是在pooling之前加上一個ReLU操作,讓這個區域的特徵變得稀疏。

Max pooling甚至是CNN網路結構本身的發明是一個reverse engineering的過程。在圖像分類的問題上,由於深度學習時代之前大家人工發明了很多成功的filters,比如edge detector之類,那麼人們就希望深度網路能夠學習出類似的filters,從而達到我們想要的目的。所以,如果一個學習出來的filter本身就是edge detector,那麼用Max pooling就make sense了;反過來,用Max pooling本身也encourage了梯度下降學習出來的filter是edge detector(或其他依賴於存在性的filter)。

所以CNN,RNN的成功在於我們把經驗和直覺賦予到了網路結構中。相比於全連接網路,這些結構有一個好的starting point,在此基礎上加上計算能力能夠refine之前人工發明的feature,從而達到更好的預測效果。這就像AlphaGo的成功是由於人類對弈的棋局給了它一個很好的搜索出發點,不用盲目去搜索全空間。但reverse enginnering的一個弱點是它不會出現顛覆性的發明,因為我們局限了它在已知的出發點附近搜索,所以它搜索出來的最優解不會顛覆我們的認知——因為it"s expected. It"s what we designed it to be.

扯遠了,對於pooling的「理論」研究嘗試並不是沒有。Y-Lan Boureau在[1]中曾經試圖做過一些理論分析,可惜並沒有什麼指導意義。大概想法是假設pooling前這個區域的n個點的值都服從同一個伯努利分布。那麼兩張不同類型的image進來,一個貓和一個狗,對應的這個伯努利分布的不一樣,計作 XY 。作者討論了 |EX - EY| (對應Mean pooling) 和 |EX_{(n)} - EY_{(n)}| (對應Max pooling) 哪個更大。。。首先這個模型的i.i.d假設和伯努利分布都是不符合現實的,而且沒有考慮梯度下降中對weight學習的影響,所以這個分析的意義很有限。

Max和Mean pooling本身也可視作filter,只不過它們的activation和weight都是人為設定好了,不需要再learn。用什麼樣的pooling(甚至網路結構)好還是依賴於具體的問題,因為它只不過是我們reverse engineering的手段罷了。如果從這個角度看問題,pooling也許並不是我們encode這一直覺的唯一手段[2]。

[1] A Theoretical Analysis of Feature Pooling in Visual Recognition

[2] Striving for Simplicity: The All Convolutional Net


左邊圖形X在經過卷積之後,會變成右邊的樣子,其中越匹配的區域數值越高,是圖片中越重要的特徵。

最大池化保留了每一小塊中最大值,也就保留了這一塊區域最佳匹配的結果。這也意味著CNN不關注窗口內到底是哪一個位置匹配上了,只關注是不是某個地方匹配上了。這讓CNN能夠發現圖片中是否具有某種特徵,而不在意這個特徵到底在哪裡。這也就解決了計算機只會死板匹配像素的問題。此外,池化還是一個欠採樣的過程,可以很大程度上減少計算量,降低模型複雜度。


pooling的初衷是平移(位置)不變,也就是位置不敏感,有無很重要。目標只要存在特徵就能被模板檢測到。max pooling就是把檢測到的對應信號放出來。



做個貓檢測,結果就只有圖片中間有貓,左右都是花花草草,你說有貓沒得(用四川話念)?

當然是有啊!

貓就是這個極大值,你要的是找貓,不是看平均每個像素有多少貓,自然使用maxpool而不是均值pool辣!


pooling的理論解釋是比較蒼白的,更多的是一個實驗結果,能很好的減少計算量和限制網路規模,讓模型更容易訓練。就mean和max兩種方式而言,mean是線性運算,max是非線性。前者網路自己是比較容易學到的,後者相對而言則更難學。這也是後者更為流行的一個原因。


max pooling一方面是降resolution可以減少參數,另一方面提取部分的激活值,因為這個激活值是卷積的結果,卷積其實在做template matching,所以我總是理解為在提取使得卷積核響應最強的那些感受野

average pooling在googlenet resnet有用到,被用來替換最後classifier之前的fc層,是實驗發現效果相仿而用pooling參數直接不需要了,而實際上之前alexnet vgg大量參數集中在最後幾層fc層,所以認為average pooling很有用

再補充一點,正是因為有了pooling把high res變low res,我們才會說更深層conv layer是high level representation,因為這時一個神經元對應原始輸入圖片的感受野更大,它提取的特徵是更global的結構,同時也就丟失了很多細節信息,這正是max pooling做的事情,把並不重要的扔掉了,這也提供了一種魯棒性,對更細節的顏色或者紋理關注更小了

其他的pooling我就沒有看到過了,倒是在semantic segmentation有一些unpooling,不過和你想問的關係不大


常見用於CNN中節點的activation function的值域都是大於等於0的(比如relu)。可以想像一下,如果每一個input以及所有hidden layer的輸出(下一層的輸入)都為0,那麼輸出也是0,也就是整個網路結構並沒有被activated。 max pool的作用主要在於降維,減少parameters個數。那再減少輸入的個數同時,max pool選擇最大的那個,就能夠儘可能保證接下來緊接的這一層會有較大值的激勵。 這是我的理解,希望有幫助。


其實這和卷積操作有關,卷積核本質上可以看做是一個濾波器,或者說是一個小二分類神經網路用來判斷是否是某一個特徵的概率。因為每個卷積核只對一個特徵敏感,過濾出來的map只是表示一個特徵的概率分布狀況,所以取相鄰區域的最大值並不會對其他特徵的信息構成影響,即使是本卷積核的特徵損失也是微乎其微的


最小值也可以的啊。相當於做個濾波,減少計算量吧


maxpool的目的在於關注每個patch裡面的重要信息,同時減少數據量,對於計算來說是非常有效的。同時也在一定程度上避免整個模型過擬合。


最簡單的,看到沒有這麼回答。來一個不一樣的。

maxpooling可以看做是一種正則。dropout。


既然是人工智慧,一定要加入一些人的思想,去掉就叫機器智能。沒有它其實不影響結果的。降噪和降維都不是它的主要目的。主要是讓初者看不懂。

maxpool 這種操作機器是學不出來的,這讓我們反思現在的網路結構是否合理,反之如果有人說能學出來,也證明這個是人為的設定,沒有必要性。

減少人為設定不是我們採用深度學習的初衷嗎,這個其實可以沒有的。


濾波(max) + 多尺度(pooling)

去了解下 中值/均值濾波,圖像金字塔等基礎操作

推薦岡薩雷斯的數字圖像處理


原理就是小窗口中取最大值。取最大值可以忽略掉某些雜訊,突顯信號好。你可以找幾篇研究這個process 的論文。


沒有道理。

最近很多文章取消pool照樣有好結果。


The advantage for using pooling is that it reduces the output dimensionality and keeps the most salient feature, but with the downside that we lose information about where exactly that feature appeared.


http://scs.ryerson.ca/~aharley/vis/conv/

可以直觀理解下,max-pool應該是一種最簡單的降維方法。


個人理解,MaxPooling有以下幾點作用:1. 減少運算量;2. 一個卷積核可以認為是一種特徵提取器,遇到符合的特徵會得到較大的值,通過取max可以避免其他不相關特徵的干擾; 3. 同樣的特徵,會存在強弱、位置等方面的差異,但都是相同的特徵,通過取max可以避免位置帶來的干擾。


感覺是用relu的時候用min pool會有很多0?


推薦閱讀:

如何用FPGA加速卷積神經網路(CNN)?
深度圖像depth image作為CNN卷積神經網路的輸入層有什麼技巧?選用什麼網路模型能取得好效果?
Pytorch如何自定義損失函數(Loss Function)?
Krizhevsky等人是怎麼想到在CNN里用Dropout和ReLu的?
卷積神經網路提取圖像特徵時具有旋轉不變性嗎?

TAG:機器學習 | 模式識別 | 神經網路 | 深度學習DeepLearning | 卷積神經網路CNN |