<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          【綜述】盤點(diǎn)卷積神經(jīng)網(wǎng)絡(luò)中的池化操作

          共 6618字,需瀏覽 14分鐘

           ·

          2022-06-09 21:23

          點(diǎn)擊上方小白學(xué)視覺”,選擇加"星標(biāo)"或“置頂

          重磅干貨,第一時(shí)間送達(dá)

          池化操作(Pooling)是CNN中非常常見的一種操作,池化操作通常也叫做子采樣(Subsampling)或降采樣(Downsampling),在構(gòu)建卷積神經(jīng)網(wǎng)絡(luò)時(shí),往往會用在卷積層之后,通過池化來降低卷積層輸出的特征維度,有效減少網(wǎng)絡(luò)參數(shù)的同時(shí)還可以防止過擬合現(xiàn)象。

          主要功能有以下幾點(diǎn):

          1. 抑制噪聲,降低信息冗余
          2. 提升模型的尺度不變性、旋轉(zhuǎn)不變形
          3. 降低模型計(jì)算量
          4. 防止過擬合

          一提到池化操作,大部分人第一想到的就是maxpool和avgpool,實(shí)際上還有很多種池化操作。

          大部分pooling操作滿足上圖的模型,假設(shè)輸入大小為, 輸出大小為, kernel size簡稱, stride簡稱,滿足以下公式:

          ?

          1. 最大/平均池化

          最大池化就是選擇圖像區(qū)域中最大值作為該區(qū)域池化以后的值,反向傳播的時(shí)候,梯度通過前向傳播過程的最大值反向傳播,其他位置梯度為0。

          使用的時(shí)候,最大池化又分為重疊池化和非重疊池化,比如常見的stride=kernel size的情況屬于非重疊池化,如果stride

          非重疊池化一個(gè)應(yīng)用的例子就是yolov3-tiny的backbone最后一層,使用了一個(gè)stride=1, kernel size=2的maxpool進(jìn)行特征的提取。

          >>> import torch
          >>> import torch.nn.functional as F
          >>> input = torch.Tensor(4,3,16,16)
          >>> output = F.max_pool2d(input, kernel_size=2, stride=2)
          >>> output.shape
          torch.Size([4, 3, 8, 8])
          >>>

          平均池化就是將選擇的圖像區(qū)域中的平均值作為該區(qū)域池化以后的值。

          >>> import torch
          >>> import torch.nn.functional as F
          >>> input = torch.Tensor(4,3,16,16)
          >>> output = F.avg_pool2d(input, kernel_size=2, stride=2)
          >>> output.shape
          torch.Size([4, 3, 8, 8])
          >>>

          ?

          2. 隨機(jī)池化


          Stochastic pooling如下圖所示,特征區(qū)域的大小越大,代表其被選擇的概率越高,比如左下角的本應(yīng)該是選擇7,但是由于引入概率,5也有一定幾率被選中。

          下表是隨機(jī)池化在CIFAR-10上的表現(xiàn),可以看出,使用隨機(jī)池化效果和采用dropout的結(jié)果接近,證明了其有一定防止過擬合的作用。

          更詳細(xì)內(nèi)容請看論文:《Stochastic Pooling for Regularization of Deep Convolutional Neural Networks》

          ?

          3. 中值池化


          與中值濾波特別相似,但是用的非常少,中值池化也具有學(xué)習(xí)邊緣和紋理結(jié)構(gòu)的特性,抗噪聲能力比較強(qiáng)。

          ?

          4. 組合池化


          組合池化則是同時(shí)利用最大值池化與均值池化兩種的優(yōu)勢而引申的一種池化策略。常見組合策略有兩種:Cat與Add。常常被當(dāng)做分類任務(wù)的一個(gè)trick,其作用就是豐富特征層,maxpool更關(guān)注重要的局部特征,而average pooling更關(guān)注全局特征。

          def add_avgmax_pool2d(x, output_size=1):
          x_avg = F.adaptive_avg_pool2d(x, output_size)
          x_max = F.adaptive_max_pool2d(x, output_size)
          return 0.5 * (x_avg + x_max)

          def cat_avgmax_pool2d(x, output_size=1):
          x_avg = F.adaptive_avg_pool2d(x, output_size)
          x_max = F.adaptive_max_pool2d(x, output_size)
          return torch.cat([x_avg, x_max], 1)

          ?

          5. Spatial Pyramid Pooling


          SPP是在SPPNet中提出的,SPPNet提出比較早,在RCNN之后提出的,用于解決重復(fù)卷積計(jì)算和固定輸出的兩個(gè)問題,具體方法如下圖所示:

          在feature map上通過selective search獲得窗口,然后將這些區(qū)域輸入到CNN中,然后進(jìn)行分類。

          實(shí)際上SPP就是多個(gè)空間池化的組合,對不同輸出尺度采用不同的劃窗大小和步長以確保輸出尺度相同,同時(shí)能夠融合金字塔提取出的多種尺度特征,能夠提取更豐富的語義信息。常用于多尺度訓(xùn)練和目標(biāo)檢測中的RPN網(wǎng)絡(luò)。

          在YOLOv3中有一個(gè)網(wǎng)絡(luò)結(jié)構(gòu)叫yolov3-spp.cfg, 這個(gè)網(wǎng)絡(luò)往往能達(dá)到比yolov3.cfg本身更高的準(zhǔn)確率,具體cfg如下:

          ### SPP ###
          [maxpool]
          stride=1
          size=5

          [route]
          layers=-2

          [maxpool]
          stride=1
          size=9

          [route]
          layers=-4

          [maxpool]
          stride=1
          size=13

          [route]
          layers=-1,-3,-5,-6

          ### End SPP ###

          這里的SPP相當(dāng)于是原來的SPPNet的變體,通過使用多個(gè)kernel size的maxpool,最終將所有feature map進(jìn)行concate,得到新的特征組合。

          再來看一下官方提供的yolov3和yolov3-spp在COCO數(shù)據(jù)集上的對比:

          可以看到,在幾乎不增加FLOPS的情況下,YOLOv3-SPP要比YOLOv3-608mAP高接近3個(gè)百分點(diǎn)。

          分析一下SPP有效的原因:

          1. 從感受野角度來講,之前計(jì)算感受野的時(shí)候可以明顯發(fā)現(xiàn),maxpool的操作對感受野的影響非常大,其中主要取決于kernel size大小。在SPP中,使用了kernel size非常大的maxpool會極大提高模型的感受野,筆者沒有詳細(xì)計(jì)算過darknet53這個(gè)backbone的感受野,在COCO上有效很可能是因?yàn)閎ackbone的感受野還不夠大。
          2. 第二個(gè)角度是從Attention的角度考慮,這一點(diǎn)啟發(fā)自CSDN@小楞(鏈接在參考文獻(xiàn)中),他在文章中這樣講:

          出現(xiàn)檢測效果提升的原因:通過spp模塊實(shí)現(xiàn)局部特征和全局特征(所以空間金字塔池化結(jié)構(gòu)的最大的池化核要盡可能的接近等于需要池化的featherMap的大?。┑膄eatherMap級別的融合,豐富最終特征圖的表達(dá)能力,從而提高M(jìn)AP。

          Attention機(jī)制很多都是為了解決遠(yuǎn)距離依賴問題,通過使用kernel size接近特征圖的size可以以比較小的計(jì)算代價(jià)解決這個(gè)問題。另外就是如果使用了SPP模塊,就沒有必要在SPP后繼續(xù)使用其他空間注意力模塊比如SK block,因?yàn)樗麄冏饔孟嗨?,可能會有一定冗余?/span>

          ps: 這個(gè)想法還沒有進(jìn)行試驗(yàn)的驗(yàn)證,有興趣的可以將YOLOv3-spp中的kernel size改為19,然后在COCO數(shù)據(jù)集上測試,看是否能夠超越60.6。

          ?

          6. Global Average/Max Pooling


          Gloabel Average Pooling 是NIN里邊的做法,一般使用torchvision提供的預(yù)訓(xùn)練模型進(jìn)行finetune的時(shí)候,通常使用Global Average Pooling,原因就是可以不考慮圖片的輸入尺寸,只與filter有關(guān)。

          >>> import torch
          >>> from torch.nn import AdaptiveAvgPool2d
          >>> input = torch.zeros((4,12,18,18)) # batch size, fileter, h, w
          >>> gap = AdaptiveAvgPool2d(1)
          >>> output = gap(input)
          >>> output.shape
          torch.Size([4, 12, 1, 1])
          >>> output.view(input.shape[0],-1).shape
          torch.Size([4, 12])
          >>>

          ?

          7. NetVLAD池化

          這部分來自:DeepLearning-500-questions#5

          NetVLAD是論文《NetVLAD: CNN Architecture for Weakly Supervised Place Recognition》提出的一個(gè)局部特征聚合的方法。

          在傳統(tǒng)的網(wǎng)絡(luò)里面,例如VGG啊,最后一層卷積層輸出的特征都是類似于Batchsize x 3 x 3 x 512的這種東西,然后會經(jīng)過FC聚合,或者進(jìn)行一個(gè)Global Average Pooling(NIN里的做法),或者怎么樣,變成一個(gè)向量型的特征,然后進(jìn)行Softmax or 其他的Loss。

          這種方法說簡單點(diǎn)也就是輸入一個(gè)圖片或者什么的結(jié)構(gòu)性數(shù)據(jù),然后經(jīng)過特征提取得到一個(gè)長度固定的向量,之后可以用度量的方法去進(jìn)行后續(xù)的操作,比如分類啊,檢索啊,相似度對比等等。

          那么NetVLAD考慮的主要是最后一層卷積層輸出的特征這里,我們不想直接進(jìn)行欠采樣或者全局映射得到特征,對于最后一層輸出的W x H x D,設(shè)計(jì)一個(gè)新的池化,去聚合一個(gè)“局部特征“,這即是NetVLAD的作用。

          NetVLAD的一個(gè)輸入是一個(gè)W x H x D的圖像特征,例如VGG-Net最后的3 x 3 x 512這樣的矩陣,在網(wǎng)絡(luò)中還需加一個(gè)維度為Batchsize。

          NetVLAD還需要另輸入一個(gè)標(biāo)量K即表示VLAD的聚類中心數(shù)量,它主要是來構(gòu)成一個(gè)矩陣C,是通過原數(shù)據(jù)算出來的每一個(gè)特征的聚類中心,C的shape即,然后根據(jù)三個(gè)輸入,VLAD是計(jì)算下式的V:

          其中j表示維度,從1到D,可以看到V的j是和輸入與c對應(yīng)的,對每個(gè)類別k,都對所有的x進(jìn)行了計(jì)算,如果屬于當(dāng)前類別k,,否則,計(jì)算每一個(gè)x和它聚類中心的殘差,然后把殘差加起來,即是每個(gè)類別k的結(jié)果,最后分別L2正則后拉成一個(gè)長向量后再做L2正則,正則非常的重要,因?yàn)?strong>這樣才能統(tǒng)一所有聚類算出來的值,而殘差和的目的主要是消減不同聚類上的分布不均,兩者共同作用才能得到最后正常的輸出。

          輸入與輸出如下圖所示:

          NETVALD示意圖

          中間得到的K個(gè)D維向量即是對D個(gè)x都進(jìn)行了與聚類中心計(jì)算殘差和的過程,最終把K個(gè)D維向量合起來后進(jìn)行即得到最終輸出的長度的一維向量。

          而VLAD本身是不可微的,因?yàn)樯厦娴腶要么是0要么是1,表示要么當(dāng)前描述x是當(dāng)前聚類,要么不是,是個(gè)離散的,NetVLAD為了能夠在深度卷積網(wǎng)絡(luò)里使用反向傳播進(jìn)行訓(xùn)練,對a進(jìn)行了修正。

          那么問題就是如何重構(gòu)一個(gè)a,使其能夠評估當(dāng)前的這個(gè)x和各個(gè)聚類的關(guān)聯(lián)程度?用softmax來得到:

          將這個(gè)把上面的a替換后,即是NetVLAD的公式,可以進(jìn)行反向傳播更新參數(shù)。

          所以一共有三個(gè)可訓(xùn)練參數(shù),上式a中的,上式a中的,聚類中心,而原始VLAD只有一個(gè)參數(shù)c。

          最終池化得到的輸出是一個(gè)恒定的K x D的一維向量(經(jīng)過了L2正則),如果帶Batchsize,輸出即為Batchsize x (K x D)的二維矩陣。

          NetVLAD作為池化層嵌入CNN網(wǎng)絡(luò)即如下圖所示,

          image

          原論文中采用將傳統(tǒng)圖像檢索方法VLAD進(jìn)行改進(jìn)后應(yīng)用在CNN的池化部分作為一種另類的局部特征池化,在場景檢索上取得了很好的效果。

          后續(xù)相繼又提出了ActionVLAD、ghostVLAD等改進(jìn)。

          評價(jià):這個(gè)NetVLAD Layer和SENet非常相似,可以看做是通道注意力機(jī)制的實(shí)現(xiàn),不過具體實(shí)現(xiàn)方法有別于SENet。

          ?

          8. 雙線性池化


          Bilinear Pooling是在《Bilinear CNN Models for Fine-grained Visual Recognition》被提出的,主要用在細(xì)粒度分類網(wǎng)絡(luò)中。雙線性池化主要用于特征融合,對于同一個(gè)樣本提取得到的特征x和特征y, 通過雙線性池化來融合兩個(gè)特征(外積),進(jìn)而提高模型分類的能力。

          主要思想是對于兩個(gè)不同圖像特征的處理方式上的不同。傳統(tǒng)的,對于圖像的不同特征,我們常用的方法是進(jìn)行串聯(lián)(連接),或者進(jìn)行sum,或者max-pooling。論文的主要思想是,研究發(fā)現(xiàn)人類的大腦發(fā)現(xiàn),人類的視覺處理主要有兩個(gè)pathway, the ventral stream是進(jìn)行物體識別的,the dorsal stream 是為了發(fā)現(xiàn)物體的位置。

          論文基于這樣的思想,希望能夠?qū)蓚€(gè)不同特征進(jìn)行結(jié)合來共同發(fā)揮作用,提高細(xì)粒度圖像的分類效果。論文希望兩個(gè)特征能分別表示圖像的位置和對圖形進(jìn)行識別。論文提出了一種Bilinear Model。

          如果特征 x 和特征y來自兩個(gè)特征提取器,則被稱為多模雙線性池化(MBP,Multimodal Bilinear Pooling)

          如果特征 x = 特征 y,則被稱為同源雙線性池化(HBP,Homogeneous Bilinear Pooling)或者二階池化(Second-order Pooling)。

          pytorch實(shí)現(xiàn):

          X = torch.reshape(N, D, H * W)                        # Assume X has shape N*D*H*W
          X = torch.bmm(X, torch.transpose(X, 1, 2)) / (H * W) # Bilinear pooling
          assert X.size() == (N, D, D)
          X = torch.reshape(X, (N, D * D))
          X = torch.sign(X) * torch.sqrt(torch.abs(X) + 1e-5) # Signed-sqrt normalization
          X = torch.nn.functional.normalize(X) # L2 normalization

          之后又有很多人出于對雙線性池化存在的特征維度過高等問題進(jìn)行各種改進(jìn),具體可以看知乎文章:

          https://zhuanlan.zhihu.com/p/62532887

          ?

          9. UnPooling


          是一種上采樣操作,具體操作如下:

          流程描述:

          1.在Pooling(一般是Max Pooling)時(shí),保存最大值的位置。

          2.中間經(jīng)歷若干網(wǎng)絡(luò)層的運(yùn)算。

          3.上采樣階段,利用第1步保存的Max Location,重建下一層的feature map。

          UnPooling不完全是Pooling的逆運(yùn)算,Pooling之后的feature map,要經(jīng)過若干運(yùn)算,才會進(jìn)行UnPooling操作;對于非Max Location的地方以零填充。然而這樣并不能完全還原信息。

          好消息!?

          小白學(xué)視覺知識星球

          開始面向外開放啦??????




          下載1:OpenCV-Contrib擴(kuò)展模塊中文版教程
          在「小白學(xué)視覺」公眾號后臺回復(fù):擴(kuò)展模塊中文教程,即可下載全網(wǎng)第一份OpenCV擴(kuò)展模塊教程中文版,涵蓋擴(kuò)展模塊安裝、SFM算法、立體視覺、目標(biāo)跟蹤、生物視覺、超分辨率處理等二十多章內(nèi)容。

          下載2:Python視覺實(shí)戰(zhàn)項(xiàng)目52講
          小白學(xué)視覺公眾號后臺回復(fù):Python視覺實(shí)戰(zhàn)項(xiàng)目,即可下載包括圖像分割、口罩檢測、車道線檢測、車輛計(jì)數(shù)、添加眼線、車牌識別、字符識別、情緒檢測、文本內(nèi)容提取、面部識別等31個(gè)視覺實(shí)戰(zhàn)項(xiàng)目,助力快速學(xué)校計(jì)算機(jī)視覺。

          下載3:OpenCV實(shí)戰(zhàn)項(xiàng)目20講
          小白學(xué)視覺公眾號后臺回復(fù):OpenCV實(shí)戰(zhàn)項(xiàng)目20講,即可下載含有20個(gè)基于OpenCV實(shí)現(xiàn)20個(gè)實(shí)戰(zhàn)項(xiàng)目,實(shí)現(xiàn)OpenCV學(xué)習(xí)進(jìn)階。

          交流群


          歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動(dòng)駕駛、計(jì)算攝影、檢測、分割、識別、醫(yī)學(xué)影像、GAN、算法競賽等微信群(以后會逐漸細(xì)分),請掃描下面微信號加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三?+?上海交大?+?視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進(jìn)入相關(guān)微信群。請勿在群內(nèi)發(fā)送廣告,否則會請出群,謝謝理解~


          瀏覽 34
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  97久久爽无码人妻AⅤ精品牛牛 | 91在线无码精品秘 少萝 | 最新的黄色网址 | 欧美三级片播放 | 亚洲一二三四区 |