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