漲點神器!SoftPool:一種新的池化方法,帶你起飛!
點擊上方“AI算法與圖像處理”,選擇加"星標"或“置頂”
重磅干貨,第一時間送達
本文轉載自:AI人工智能初學者

論文:https://arxiv.org/abs/2101.00440
項目代碼鏈接:
https://github.com/alexandrosstergiou/SoftPool
本文提出了一種快速、高效的池化方法SoftPool,Softpool可以以指數(shù)加權方式累加激活。與一系列其他池化方法相比,SoftPool在下采樣激活映射中保留了更多的信息,可以獲得更好的分類精度。在ImageNet上,對于一系列流行的CNN架構,用SoftPool替換原來的池化操作可以帶來1-2%的一致性精度提升。
作者單位:烏得勒支大學 華威大學
1 簡介
通常卷積神經(jīng)網(wǎng)絡(CNNs)都會使用池化pool操作來減少Feature Map的尺寸。這個過程對于實現(xiàn)局部空間不變和增加后續(xù)卷積的感受野是至關重要的。因此池化pool操作應該盡量減少Feature Map映射中信息的丟失。同時,應該限制計算和內(nèi)存開銷。
為了滿足這些需求,本文提出了一種快速、高效的池化方法SoftPool,softpool可以以指數(shù)加權方式累加激活。與一系列其他池化方法相比,SoftPool在下采樣激活映射中保留了更多的信息。更精細的下采樣導致更好的分類精度。在ImageNet上,對于一系列流行的CNN架構,用SoftPool替換原來的池化操作可以帶來1-2%的一致性精度提升。SoftPool在視頻數(shù)據(jù)集上的動作識別。同樣,在計算負載和內(nèi)存仍然有限的情況下,僅替換池化層依然可以提高精度。

2 前人工作
2.1 Hand-crafted Pooling特征
下采樣已被廣泛應用于手工編碼的特征提取方法之中,如Bag-of-Words和Bag-of-Features,在這些方法中圖像被視為局部斑塊的集合,通過pooling和encode為向量。該方法還與空間金字塔匹配相結合進行了研究,以保持空間信息。
后來的工作考慮了空間區(qū)域中最大SIFT特征的選擇。腦池化主要與max-pooling的使用有關,因為生物學上類似max的皮層信號具有魯棒性。Boureau等人研究了最大池化(Max Pooling)和平均池化(Avg Pooling)。Max-pooling已經(jīng)被有效地應用并由不錯的效果和性能。
2.2 Pooling in CNNs
傳統(tǒng)上,池化的主要好處是創(chuàng)建了比原始版本小得多的表征,從而減少了計算需求,并支持創(chuàng)建更大、更深層次的網(wǎng)絡架構。
下采樣的池化方法
Average Pooling:區(qū)域平均值。 Max Pooling:區(qū)域最大值。 Stochastic Pooling:它使用一個核區(qū)域內(nèi)激活的概率加權抽樣。 Mix Pooling:基于最大池化和平均池化的混合池化。 Power average Pooling:基于平均和最大化的結合,冪平均(Lp)池化利用一個學習參數(shù)p來確定這兩種方法的相對重要性;當p=1時,使用局部求和,而p為無窮大時,對應max-pooling。

網(wǎng)格采樣的池化方法
S3 Pooling:對原始Feature Map網(wǎng)格中的行和列進行隨機采樣。 Preserving Pooling:使用平均池化,同時用高于平均值的值增強激活。 Local Importance Pooling:進一步評估了如何將學習到的權值作為一種基于子網(wǎng)絡注意的機制來使用,該機制可用于匯集信息特征,同時丟棄無信息特征。

與前面描述的操作相比,一些池化方法有嚴格的架構或基于任務的標準,這些標準將它們的應用限制在特定的CNN架構和任務上:
Spatial Pyramid Pooling ROI-Pool ROI-align
上述大多數(shù)方法都是依賴于最大池化和平均池化的不同組合。而SoftPool的工作不是結合現(xiàn)有的方法,而是基于softmax加權方法來保留輸入的基本屬性,同時放大更大強度的特征激活。與max-pooling不同softpool是可微的。

因此,在反向傳播過程中為每個輸入獲得一個梯度,這可能會提高訓練效果。我們在上圖中演示了SoftPool的效果。
其他以前的方法使用可訓練的參數(shù)導致計算成本增加,直接影響較大網(wǎng)絡的可用性。相比之下,SoftPool可以替代任何池化操作,包括最大池化和平均池化,而且計算和內(nèi)存效率都很高。
3 SoftPool方法
從這里開始正式介紹SoftPool中信息的正向傳播和反向傳播。考慮activation map(a)中的 local region (R),其維數(shù)為C×H×W,通道數(shù)為C,通道高度為H,通道寬度為W。為了簡化符號這里省略通道維數(shù),并假設R是與考慮的二維空間區(qū)域的激活相對應的索引集。對于大小為k×k的池化kernel定義。池化操作的輸出為,對應的梯度用表示。
3.1 Exponential maximum kernels
SoftPool受到Riesenhuber和Poggio的皮層神經(jīng)模擬以及早期使用Boureau等人的手工編碼特征的池化實驗的影響。該方法以自然指數(shù)(e)為基礎,保證了較大的激活值對輸出的影響較大。
SoftPool是可微的,這意味著所有在局部鄰域內(nèi)的激活在反向傳播期間將被分配至少一個最小梯度值。這與使用最大池化的方法相反。SoftPool利用激活區(qū)域內(nèi)的最大近似R。每一個指數(shù)為的激活應用一個權重,該權重計算為該激活的自然指數(shù)與鄰域R內(nèi)所有激活的自然指數(shù)之和的比值:

權重與相應的激活值一起用作非線性變換。較高的激活比較低的激活占更多的主導地位。因為大多數(shù)池化操作都是在高維的特征空間中執(zhí)行的,突出顯示具有更大效果的激活比簡單地選擇最大值是一種更平衡的方法。
在后一種情況下,丟棄大部分激活會帶來丟失重要信息的風險。相反,平均池化中激活的貢獻相等,可以顯著降低整體區(qū)域特征強度。
SoftPool操作的輸出值是通過對內(nèi)核鄰域R內(nèi)所有加權激活的標準求和得到的:

與其他基于最大池化和平均池化的方法相比,使用區(qū)域的softmax產(chǎn)生歸一化結果,其概率分布與每個激活值相對于核區(qū)域的鄰近激活值成比例。這與最大激活值選擇或對內(nèi)核區(qū)域的所有激活取平均形成了直接對比,而內(nèi)核區(qū)域的輸出激活是沒有規(guī)則化的。因此是可微的。
Pytorch實現(xiàn)soft_pool2d如下:
def?soft_pool2d(x,?kernel_size=2,?stride=None,?force_inplace=False):
????if?x.is_cuda?and?not?force_inplace:
????????return?CUDA_SOFTPOOL2d.apply(x,?kernel_size,?stride)
????kernel_size?=?_pair(kernel_size)
????if?stride?is?None:
????????stride?=?kernel_size
????else:
????????stride?=?_pair(stride)
????#?Get?input?sizes
????_,?c,?h,?w?=?x.size()
????#?Create?per-element?exponential?value?sum?:?Tensor?[b?x?1?x?h?x?w]
????e_x?=?torch.sum(torch.exp(x),dim=1,keepdim=True)
????#?Apply?mask?to?input?and?pool?and?calculate?the?exponential?sum
????#?Tensor:?[b?x?c?x?h?x?w]?->?[b?x?c?x?h'?x?w']
????return?F.avg_pool2d(x.mul(e_x),?kernel_size,?stride=stride).mul_(sum(kernel_size)).div_(F.avg_pool2d(e_x,?kernel_size,?stride=stride).mul_(sum(kernel_size)))
3.2 Gradient calculation
完整的向前和向后信息流下圖所示:

在訓練的更新階段,所有網(wǎng)絡參數(shù)的梯度都是根據(jù)在上一層計算的誤差導數(shù)進行更新的。當在整個網(wǎng)絡體系結構中反向傳播時,這會創(chuàng)建一個更新鏈。在SoftPool中,梯度更新與前向傳播過程中計算的權重成比例。這對應于較小激活的梯度更新小于實質性激活的梯度更新。
Softmax與max或隨機池化不同,Softmax是可微的。因此,在反向傳播期間,一個最小的非零權值將被分配給一個核區(qū)域內(nèi)的每一個激活。這樣就可以計算出該區(qū)域每一次激活的梯度。
在SoftPool實現(xiàn)中使用了給定精度級別有限范圍的可能值,保留了softmax的可微性質,通過給定每個類型使用的比特數(shù)分配一個較低的算術限制。這可以防止算術下溢。也為內(nèi)核值和最終求和中使用的生成的激活值實現(xiàn)了這種機制。
3.3 Feature preservation
Sub-Sampling的一個整體目標是在保持輸入的代表性特征的同時最小化整體分辨率。創(chuàng)建原始輸入的無代表性的下采樣可能對整個模型的性能有負面影響,因此輸入的表示可能對任務也會有負面影響。
目前廣泛使用的池化技術在某些情況下可能是無效的。Avg Pooling降低了該區(qū)域內(nèi)所有激活的效果,而Max Pooling僅選擇該區(qū)域內(nèi)單個激活最高的激活。
SoftPool的作用介于這兩種池化方法之間,因為該區(qū)域的所有激活都對最終輸出有貢獻,而較高的激活比較低的激活占主導地位。該方法可以平衡Avg Pooling和Max Pooling的影響,同時利用兩者的有利屬性。
下圖顯示了SoftPool可以保留的詳細級別的示例,即使在圖像被大量抽樣的情況下顏色與原始圖像保持一致。

3.4 Spatio-temporal kernels
CNN也被擴展到使用3D輸入來表示額外的維度,如深度和時間。為了適應這些輸入,可以通過在內(nèi)核中包含一個額外的維度對SoftPool進行擴展;對于一個具有維度的輸入激活映射,以T為時間范圍,將二維空間核區(qū)域R轉換為三維時空區(qū)域,其中三維空間在時間維度上運行。
產(chǎn)生的輸出現(xiàn)在包含壓縮的時空信息。通過增加維度,所需的池化屬性(如有限的信息丟失、可微函數(shù)以及較低的計算和內(nèi)存開銷)變得更加重要。Pytorch實現(xiàn)soft_pool3d如下:
def?soft_pool3d(x,?kernel_size=2,?stride=None,?force_inplace=False):
????if?x.is_cuda?and?not?force_inplace:
????????return?CUDA_SOFTPOOL3d.apply(x,?kernel_size,?stride)
????kernel_size?=?_triple(kernel_size)
????if?stride?is?None:
????????stride?=?kernel_size
????else:
????????stride?=?_triple(stride)
????#?Get?input?sizes
????_,?c,?d,?h,?w?=?x.size()
????#?Create?per-element?exponential?value?sum?:?Tensor?[b?x?1?x?d?x?h?x?w]
????e_x?=?torch.sum(torch.exp(x),dim=1,keepdim=True)
????#?Apply?mask?to?input?and?pool?and?calculate?the?exponential?sum
????#?Tensor:?[b?x?c?x?d?x?h?x?w]?->?[b?x?c?x?d'?x?h'?x?w']
????return?F.avg_pool3d(x.mul(e_x),?kernel_size,?stride=stride).mul_(sum(kernel_size)).div_(F.avg_pool3d(e_x,?kernel_size,?stride=stride).mul_(sum(kernel_size)))
4 實驗結果
4.1 ImageNet-1K分類

通過上表可以看出,直接在Backbone的基礎上把池化方法替換為SotfPool,效果有明顯的提升。
4.2 視頻分類實驗

可以看出即使是3D CNN Model中SoftPool依然有效。
5 參考
[1].Refining activation downsampling with SoftPool
[2].https://github.com/alexandrosstergiou/SoftPool
下載1:何愷明頂會分享
在「AI算法與圖像處理」公眾號后臺回復:何愷明,即可下載。總共有6份PDF,涉及 ResNet、Mask RCNN等經(jīng)典工作的總結分析
下載2:終身受益的編程指南:Google編程風格指南
在「AI算法與圖像處理」公眾號后臺回復:c++,即可下載。歷經(jīng)十年考驗,最權威的編程規(guī)范!
下載3 CVPR2020 在「AI算法與圖像處理」公眾號后臺回復:CVPR2020,即可下載1467篇CVPR?2020論文 個人微信(如果沒有備注不拉群!) 請注明:地區(qū)+學校/企業(yè)+研究方向+昵稱
覺得不錯就點亮在看吧


