CNN中的maxpool到底是什么原理?
首先細講一下 Max pooling。
Max pooling
在卷積后還會有一個 pooling 的操作,盡管有其他的比如 average pooling 等,這里只提 max pooling。
max pooling 的操作如下圖所示:整個圖片被不重疊的分割成若干個同樣大小的小塊(pooling size)。每個小塊內(nèi)只取最大的數(shù)字,再舍棄其他節(jié)點后,保持原有的平面結(jié)構(gòu)得出 output。
max pooling 在不同的 depth 上是分開執(zhí)行的,且不需要參數(shù)控制。 那么問題就 max pooling 有什么作用?部分信息被舍棄后難道沒有影響嗎?
Max pooling 的主要功能是 downsampling,卻不會損壞識別結(jié)果。 這意味著卷積后的 Feature Map 中有對于識別物體不必要的冗余信息。 那么我們就反過來思考,這些 “冗余” 信息是如何產(chǎn)生的。
直覺上,我們?yōu)榱颂綔y到某個特定形狀的存在,用一個 filter 對整個圖片進行逐步掃描。但只有出現(xiàn)了該特定形狀的區(qū)域所卷積獲得的輸出才是真正有用的,用該 filter 卷積其他區(qū)域得出的數(shù)值就可能對該形狀是否存在的判定影響較小。 比如下圖中,我們還是考慮探測 “橫折” 這個形狀。 卷積后得到 3x3 的 Feature Map 中,真正有用的就是數(shù)字為 3 的那個節(jié)點,其余數(shù)值對于這個任務(wù)而言都是無關(guān)的。 所以用 3x3 的 Max pooling 后,并沒有對 “橫折” 的探測產(chǎn)生影響。 試想在這里例子中如果不使用 Max pooling,而讓網(wǎng)絡(luò)自己去學(xué)習(xí)。 網(wǎng)絡(luò)也會去學(xué)習(xí)與 Max pooling 近似效果的權(quán)重。因為是近似效果,增加了更多的 parameters 的代價,卻還不如直接進行 Max pooling。
Max pooling 還有類似 “選擇句” 的功能。假如有兩個節(jié)點,其中第一個節(jié)點會在某些輸入情況下最大,那么網(wǎng)絡(luò)就只在這個節(jié)點上流通信息;而另一些輸入又會讓第二個節(jié)點的值最大,那么網(wǎng)絡(luò)就轉(zhuǎn)而走這個節(jié)點的分支。
但是 Max pooling 也有不好的地方。因為并非所有的抓取都像上圖這樣的極端例子。有些周邊信息對某個概念是否存在的判定也有影響。 并且 Max pooling 是對所有的 Feature Maps 進行等價的操作。就好比用相同網(wǎng)孔的漁網(wǎng)打魚,一定會有漏網(wǎng)之魚。
下面對其他的 pooling 方法做一個簡單的整理(前一段時間整理的個人覺得比較不錯且流行的 pooling 方法)。
SUM pooling
基于 SUM pooling 的中層特征表示方法,指的是針對中間層的任意一個 channel(比如 VGGNet16, pool5 有 512 個 channel),將該 channel 的 feature map 的所有像素值求和,這樣每一個 channel 得到一個實數(shù)值,N 個 channel 最終會得到一個長度為 N 的向量,該向量即為 SUM pooling 的結(jié)果。
AVE pooling
AVE pooling 就是 average pooling,本質(zhì)上它跟 SUM pooling 是一樣的,只不過是將像素值求和后還除以了 feature map 的尺寸。作者以為,AVE pooling 可以帶來一定意義上的平滑,可以減小圖像尺寸變化的干擾。設(shè)想一張 224224 的圖像,將其 resize 到 448448 后,分別采用 SUM pooling 和 AVE pooling 對這兩張圖像提取特征,我們猜測的結(jié)果是,SUM pooling 計算出來的余弦相似度相比于 AVE pooling 算出來的應(yīng)該更小,也就是 AVE pooling 應(yīng)該稍微優(yōu)于 SUM pooling 一些。
MAX pooling
MAX pooling 指的是對于每一個 channel(假設(shè)有 N 個 channel),將該 channel 的 feature map 的像素值選取其中最大值作為該 channel 的代表,從而得到一個 N 維向量表示。筆者在 flask-keras-cnn-image-retrieval中采用的正是 MAX pooling 的方式。
上面所總結(jié)的 SUM pooling、AVE pooling 以及 MAX pooling,這三種 pooling 方式,在筆者做過的實驗中,MAX pooling 要稍微優(yōu)于 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 步驟如下:
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 的大小,然后送進網(wǎng)絡(luò),得到第七層全連接層 4096 維的特征;在 L=2 時,使用 128*128(步長為 32) 的窗口進行滑窗,由于網(wǎng)絡(luò)的圖像輸入最小尺寸是 256*256,所以作者將其上采樣到 256256,這樣可以得到很多的局部特征,然后對其進行 VLAD 編碼,其中聚類中心設(shè)置為 100,4096 維的特征降到了 500 維,這樣便得到了 50000 維的特征,然后將這 50000 維的特征再降維得到 4096 維的特征;L=3 的處理過程與 L=2 的處理過程一樣,只不過窗口的大小編程了 64*64 的大小。
作者通過實驗論證了 MOP pooling 這種方式得到的特征一定的不變性?;谶@種 MOP pooling 筆者并沒有做過具體的實驗,所以實驗效果只能參考論文本身了。
CROW pooling
對于 Object Retrieval,在使用 CNN 提取特征的時候,我們所希望的是在有物體的區(qū)域進行特征提取,就像提取局部特征比如 SIFT 特征構(gòu) BoW、VLAD、FV 向量的時候,可以采用 MSER、Saliency 等手段將 SIFT 特征限制在有物體的區(qū)域。同樣基于這樣一種思路,在采用 CNN 做 Object Retrieval 的時候,我們有兩種方式來更細化 Object Retrieval 的特征:一種是先做物體檢測然后在檢測到的物體區(qū)域里面提取 CNN 特征;另一種方式是我們通過某種權(quán)重自適應(yīng)的方式,加大有物體區(qū)域的權(quán)重,而減小非物體區(qū)域的權(quán)重。CROW pooling ( Cross-dimensional Weighting for Aggregated Deep Convolutional Features ) 即是采用的后一種方法,通過構(gòu)建 Spatial 權(quán)重和 Channel 權(quán)重,CROW pooling 能夠在一定程度上加大感興趣區(qū)域的權(quán)重,降低非物體區(qū)域的權(quán)重。其具體的特征表示構(gòu)建過程如下圖所示:
其核心的過程是 Spatial Weight 和 Channel Weight 兩個權(quán)重。Spatial Weight 具體在計算的時候,是直接對每個 channel 的 feature map 求和相加,這個 Spatial Weight 其實可以理解為 saliency map。我們知道,通過卷積濾波,響應(yīng)強的地方一般都是物體的邊緣等,因而將多個通道相加求和后,那些非零且響應(yīng)大的區(qū)域,也一般都是物體所在的區(qū)域,因而我們可以將它作為 feature map 的權(quán)重。Channel Weight 借用了 IDF 權(quán)重的思想,即對于一些高頻的單詞,比如 “the”,這類詞出現(xiàn)的頻率非常大,但是它對于信息的表達其實是沒多大用處的,也就是它包含的信息量太少了,因此在 BoW 模型中,這類停用詞需要降低它們的權(quán)重。借用到 Channel Weight 的計算過程中,我們可以想象這樣一種情況,比如某一個 channel,其 feature map 每個像素值都是非零的,且都比較大,從視覺上看上去,白色區(qū)域占據(jù)了整個 feature map,我們可以想到,這個 channel 的 feature map 是不利于我們?nèi)ザㄎ晃矬w的區(qū)域的,因此我們需要降低這個 channel 的權(quán)重,而對于白色區(qū)域占 feature map 面積很小的 channel,我們認為它對于定位物體包含有很大的信息,因此應(yīng)該加大這種 channel 的權(quán)重。而這一現(xiàn)象跟 IDF 的思想特別吻合,所以作者采用了 IDF 這一權(quán)重定義了 Channel Weight。
總體來說,這個 Spatial Weight 和 Channel Weight 的設(shè)計還是非常巧妙的,不過這樣一種 pooling 的方式只能在一定程度上契合感興趣區(qū)域,我們可以看一下 Spatial Weight*Channel Weight 的熱力圖:
從上面可以看到,權(quán)重大的部分主要在塔尖部分,這一部分可以認為是 discriminate 區(qū)域,當(dāng)然我們還可以看到,在圖像的其他區(qū)域,還有一些比較大的權(quán)重分布,這些區(qū)域是我們不想要的。當(dāng)然,從筆者可視化了一些其他的圖片來看,這種 crow pooling 方式并不總是成功的,也存在著一些圖片,其權(quán)重大的區(qū)域并不是圖像中物體的主體。不過,從千萬級圖庫上跑出來的結(jié)果來看,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 特征。其具體的滑窗方式如下圖所示:
圖中示意的是三種窗口大小,圖中‘x’代表的是窗口的中心,對于每一個窗口的 feature map,論文中采用的是 MAX pooling 的方式,在 L=3 時,也就是采用圖中所示的三種窗口大小,我們可以得到 20 個 local 特征,此外,我們對整個 fature map 做一次 MAX pooling 會得到一個 global 特征,這樣對于一幅圖像,我們可以得到 21 個 local 特征 (如果把得到的 global 特征也視為 local 的話),這 21 個 local 特征直接相加求和,即得到最終全局的 global 特征。論文中作者對比了滑動窗口數(shù)量對 mAP 的影響,從 L=1 到 L=3,mAP 是逐步提升的,但是在 L=4 時,mAP 不再提升了。實際上 RMAC pooling 中設(shè)計的窗口的作用是定位物體位置的 (CROW pooling 通過權(quán)重圖定位物體位置)。如上圖所示,在窗口與窗口之間,都是一定的 overlap,而最終在構(gòu)成 global 特征的時候,是采用求和相加的方式,因此可以看到,那些重疊的區(qū)域我們可以認為是給予了較大的權(quán)重。
上面說到的 20 個 local 特征和 1 個 global 特征,采用的是直接合并相加的方式,當(dāng)然我們還可以把這 20 個 local 特征相加后再跟剩下的那一個 global 特征串接起來。實際實驗的時候,發(fā)現(xiàn)串接起來的方式比前一種方式有 2%-3% 的提升。在規(guī)模 100 萬的圖庫上測試,RMAC pooling 能夠取得不錯的效果,跟 Crow pooling 相比,兩者差別不大。
上面總結(jié)了 6 中不同的 pooling 方式,當(dāng)然還有很多的 pooling 方式?jīng)]涵蓋不到,在實際應(yīng)用的時候,筆者比較推薦采用 RMAC pooling 和 CROW pooling 的方式,主要是這兩種 pooling 方式效果比較好,計算復(fù)雜度也比較低。
本文轉(zhuǎn)自雷鋒網(wǎng),如需轉(zhuǎn)載請至雷鋒網(wǎng)官網(wǎng)申請授權(quán)。