輕松學(xué)Pytorch – 全局池化層詳解
點擊上方“小白學(xué)視覺”,選擇加"星標(biāo)"或“置頂”
重磅干貨,第一時間送達
大家好,這是輕松學(xué)Pytorch系列的第九篇分享,本篇你將學(xué)會什么是全局池化,全局池化的幾種典型方式與pytorch相關(guān)函數(shù)調(diào)用。
?
卷積神經(jīng)網(wǎng)絡(luò)可以解決回歸跟分類問題,但是常見的卷積神經(jīng)網(wǎng)絡(luò)到最后都要通過全連接層實現(xiàn)分類,這個其實會導(dǎo)致很多時候神經(jīng)元數(shù)目跟計算量在全連接層暴增,特別對一些回歸要求比較高的網(wǎng)絡(luò)往往會帶來一些后遺癥。所以陸陸續(xù)續(xù)有人提出了不同全連接層解決方案,最常見的兩個就是把最后卷積層flatten改為全局最大/均值池化,對比一下這兩種方式,圖示如下:

可以看到全局池化會根據(jù)需要產(chǎn)生神經(jīng)元,神經(jīng)元個數(shù)可控,可調(diào)。而flatten方式就是一個硬鏈接,無法在flatten的時候調(diào)整鏈接數(shù)目。全局均值池化輸出最常見的做法是把每個通道feature map輸出一個神經(jīng)元(均值結(jié)果輸出),圖示如下:

全局最大池化圖示如下,它是取每個feature map的最大值:

全局均值池化跟全局最大池化的輸入一般為NxCxHxW,輸出為NxCx1x1但是實際上有時候我們還會有另外一個需求,就是全局深度池化,它的輸出是Nx1xHxW。這個方式的池化通常會先把數(shù)據(jù)轉(zhuǎn)換為NxH*WxC的方式,然后使用一維度最大/均值池化在C上完成,最后在轉(zhuǎn)換為Nx1xHxW即可。了解常見幾種全局池化方式之后,下面就來一起看看Pytorch中支持的相關(guān)函數(shù)。
?
Pytorch函數(shù)支持全局最大池化與均值池化,相關(guān)函數(shù)分別為:
全局最大池化
torch.nn.AdaptiveMaxPool2d(output_size, return_indices=False)全局均值池化
torch.nn.AdaptiveAvgPool2d(output_size)其中output_size表示輸出HxW正常設(shè)為HxW=1x1=(1, 1)。代碼演示如下:
# 全局均值池化avg_pooling = torch.nn.AdaptiveAvgPool2d((1,1))B, C, H, W = input.size()output = avg_pooling(input).view(B, -1)print("全局均值池化:", output.size())print(output, "\n")# 全局最大池化avg_pooling = torch.nn.AdaptiveMaxPool2d((1, 1))B, C, H, W = input.size()output = avg_pooling(input).view(B, -1)print("全局最大池化:", output.size())print(output, "\n")
輸入為NxCxHxW=1x8x4x4輸出結(jié)果如下:

但是pytorch中沒有全局深度池化函數(shù)支持,這個是我在寫一個程序時候才發(fā)現(xiàn),后來經(jīng)過一番折騰,在別人代碼的基礎(chǔ)上我改寫了一個符合我要求的全局深度池化函數(shù)。經(jīng)過測試工作良好。演示如下:
class DeepWise_Pool(torch.nn.MaxPool1d):def __init__(self, channels, isize):super(DeepWise_Pool, self).__init__(channels)self.kernel_size = channelsself.stride = isizedef forward(self, input):n, c, w, h = input.size()input = input.view(n,c,w*h).permute(0,2,1)pooled = torch.nn.functional.max_pool1d(input, self.kernel_size, self.stride,self.padding, self.dilation, self.ceil_mode,self.return_indices)_, _, c = pooled.size()pooled = pooled.permute(0,2,1)return pooled.view(n,c,w,h).view(w, h)input = torch.randn(1, 8, 4, 4)print("input data:/n", input)print("input data:", input.size())B, C, W, H = input.size()dw_max_pool = DeepWise_Pool(C, W*H)output = dw_max_pool(input)print("全局深度池化:", output.view(-1, 16).size())print(output, "\n")
針對輸入為NxCxHxW=1x8x4x4深度最大池化運行結(jié)果如下:

?
關(guān)于使用GAP或者全局池化的好處,卷積神經(jīng)網(wǎng)絡(luò)在圖像分類中,把卷積層作為特征提取,全鏈接層+softmax作為歸回分類,這樣方式會導(dǎo)致在全連接層輸入神經(jīng)元太多容易導(dǎo)致過擬合,所以Hinton等人提出了Dropout概念,提高網(wǎng)絡(luò)泛化能力防止了過擬合發(fā)生。但是GAP是另外方式避免全連接層的處理,直接通過全局池化+softmax進行分類,它的優(yōu)點是更加符合卷積層最后的處理,另外一個優(yōu)點是GAP不會產(chǎn)生額外的參數(shù),相比全連接層的處理方式,降低整個計算量,此外全局池化還部分保留來輸入圖像的空間結(jié)構(gòu)信息,所以全局池化在有些時候會是一個特別有用的選擇。更多請讀該論文:
https://arxiv.org/pdf/1312.4400.pdf好消息!?
小白學(xué)視覺知識星球
開始面向外開放啦??????
下載1:OpenCV-Contrib擴展模塊中文版教程 在「小白學(xué)視覺」公眾號后臺回復(fù):擴展模塊中文教程,即可下載全網(wǎng)第一份OpenCV擴展模塊教程中文版,涵蓋擴展模塊安裝、SFM算法、立體視覺、目標(biāo)跟蹤、生物視覺、超分辨率處理等二十多章內(nèi)容。 下載2:Python視覺實戰(zhàn)項目52講 在「小白學(xué)視覺」公眾號后臺回復(fù):Python視覺實戰(zhàn)項目,即可下載包括圖像分割、口罩檢測、車道線檢測、車輛計數(shù)、添加眼線、車牌識別、字符識別、情緒檢測、文本內(nèi)容提取、面部識別等31個視覺實戰(zhàn)項目,助力快速學(xué)校計算機視覺。 下載3:OpenCV實戰(zhàn)項目20講 在「小白學(xué)視覺」公眾號后臺回復(fù):OpenCV實戰(zhàn)項目20講,即可下載含有20個基于OpenCV實現(xiàn)20個實戰(zhàn)項目,實現(xiàn)OpenCV學(xué)習(xí)進階。 交流群
歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動駕駛、計算攝影、檢測、分割、識別、醫(yī)學(xué)影像、GAN、算法競賽等微信群(以后會逐漸細分),請掃描下面微信號加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三?+?上海交大?+?視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進入相關(guān)微信群。請勿在群內(nèi)發(fā)送廣告,否則會請出群,謝謝理解~

