編者按:Udacity深度強(qiáng)化學(xué)習(xí)課程負(fù)責(zé)人Alexis Cook講解了全局平均池化(GAP)的概念,并演示了為分類問題訓(xùn)練的GAP-CNN在目標(biāo)定位方面的能力。
圖像分類任務(wù)中,卷積神經(jīng)網(wǎng)絡(luò)(CNN)架構(gòu)的常見選擇是重復(fù)的卷積模塊(卷積層加池化層),之后是兩層以上的密集層(全連接層)。最后密集層使用softmax激活函數(shù),每個節(jié)點(diǎn)對應(yīng)一個類別。
比如,VGG-16的架構(gòu):
譯者注:上圖中,黑色的是卷積層(ReLU激活),紅色的是最大池化層,藍(lán)色的是全連接層(ReLU激活),金色的是softmax層。
運(yùn)行以下代碼,可以得到VGG-16模型的網(wǎng)絡(luò)層清單:(譯者注:需要安裝Keras)
python -c 'from keras.applications.vgg16 import VGG16; VGG16().summary()'
輸出為:
你會注意到有5個卷積模塊(兩到三個卷積層,之后是一個最大池化層)。接著,扁平化最后一個最大池化層,后面跟著三個密集層。注意模型的大部分參數(shù)屬于全連接層!
你大概可以想見,這樣的架構(gòu)有過擬合訓(xùn)練數(shù)據(jù)集的風(fēng)險。實踐中會使用dropout層以避免過擬合。
全局平均池化
最近幾年,人們開始使用全局平均池化(global average pooling,GAP)層,通過降低模型的參數(shù)數(shù)量來最小化過擬合效應(yīng)。類似最大池化層,GAP層可以用來降低三維張量的空間維度。然而,GAP層的降維更加激進(jìn),一個h × w × d的張量會被降維至1 × 1 × d。GAP層通過取平均值映射每個h × w的特征映射至單個數(shù)字。
在最早提出GAP層的網(wǎng)中網(wǎng)(Network in Network)架構(gòu)中,最后的最大池化層的輸出傳入GAP層,GAP層生成一個向量,向量的每一項表示分類任務(wù)中的一個類別。接著應(yīng)用softmax激活函數(shù)生成每個分類的預(yù)測概率。如果你打算參考原論文(arXiv:1312.4400),我特別建議你看下3.2節(jié)“全局平均池化”。
ResNet-50模型沒這么激進(jìn);并沒有完全移除密集層,而是在GAP層之后加上一個帶softmax激活函數(shù)的密集層,生成預(yù)測分類。
目標(biāo)定位
2016年年中,MIT的研究人員展示了為分類任務(wù)訓(xùn)練的包含GAP層的CNN(GAP-CNN),同樣可以用于目標(biāo)定位。也就是說,GAP-CNN不僅告訴我們圖像中包含的目標(biāo)是什么東西,它還可以告訴我們目標(biāo)在圖像中的什么地方,而且我們不需要額外為此做什么!定位表示為熱圖(分類激活映射),其中的色彩編碼方案標(biāo)明了GAP-CNN進(jìn)行目標(biāo)識別任務(wù)相對重要的區(qū)域。
我根據(jù)Bolei Zhou等的論文(arXiv:1512.04150)探索了預(yù)訓(xùn)練的ResNet-50模型的定位能力(代碼見GitHub:alexisbcook/ResNetCAM-keras)。主要的思路是GAP層之前的最后一層的每個激活映射起到了解碼圖像中的不同位置的模式的作用。我們只需將這些檢測到的模式轉(zhuǎn)換為檢測到的目標(biāo),就可以得到每張圖像的分類激活映射。
GAP層中的每個節(jié)點(diǎn)對應(yīng)不同的激活映射,連接GAP層和最后的密集層的權(quán)重編碼了每個激活映射對預(yù)測目標(biāo)分類的貢獻(xiàn)。將激活映射中的每個檢測到的模式的貢獻(xiàn)(對預(yù)測目標(biāo)分類更重要的檢測到的模式獲得更多權(quán)重)累加起來,就得到了分類激活映射。
代碼如何運(yùn)作
運(yùn)行以下代碼檢視ResNet-50的架構(gòu):
python -c 'from keras.applications.resnet50 import ResNet50; ResNet50().summary()'
輸出如下:
注意,和VGG-16模型不同,并非大部分可訓(xùn)練參數(shù)都位于網(wǎng)絡(luò)最頂上的全連接層中。
網(wǎng)絡(luò)最后的Activation、AveragePooling2D、Dense層是我們最感興趣的(上圖高亮部分)。實際上AveragePooling2D層是一個GAP層!
我們從Activation層開始。這一層包含2048個7 × 7維的激活映射。讓我們用fk表示第k個激活映射,其中k ∈{1,…,2048}。
接下來的AceragePooling2D層,也就是GAP層,通過取每個激活映射的平均值,將前一層的輸出大小降至(1,1,2048)。接下來的Flatten層只不過是扁平化輸入,沒有導(dǎo)致之前GAP層中包含信息的任何變動。
ResNet-50預(yù)測的每個目標(biāo)類別對應(yīng)最終的Dense層的每個節(jié)點(diǎn),并且每個節(jié)點(diǎn)都和之前的Flatten層的各個節(jié)點(diǎn)相連。讓我們用wk表示連接Flatten層的第k個節(jié)點(diǎn)和對應(yīng)預(yù)測圖像類別的輸出節(jié)點(diǎn)的權(quán)重。
接著,為了得到分類激活映射,我們只需計算:
我們可以將這些分類激活映射繪制在選定的圖像上,以探索ResNet-50的定位能力。為了便于和原圖比較,我們應(yīng)用了雙線性上采樣,將激活映射的大小變?yōu)?24 × 224.
如果你想在你自己的目標(biāo)定位問題上應(yīng)用這些代碼,可以訪問GitHub:https://github.com/alexisbcook/ResNetCAM-keras
-
神經(jīng)網(wǎng)絡(luò)
+關(guān)注
關(guān)注
42文章
4772瀏覽量
100808 -
圖像分類
+關(guān)注
關(guān)注
0文章
90瀏覽量
11923 -
強(qiáng)化學(xué)習(xí)
+關(guān)注
關(guān)注
4文章
266瀏覽量
11262
原文標(biāo)題:用于目標(biāo)定位的全局平均池化
文章出處:【微信號:jqr_AI,微信公眾號:論智】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論