即插即用的轻量注意力机制ECA--Net
論文名:ECA-Net: Effificient Channel Attention for Deep Convolutional Neural Networks
論文:https://arxiv.org/abs/1910.03151
開源代碼:https://github.com/BangguWu/ECANet
首先上結果圖,看著真香!!!
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??如圖1?縱坐標為準確性,橫坐標為模型參數量(類似空間復雜度)
0.論文摘要
最近,通道注意力機制被證明在改善深度卷積神經網絡(CNNs)的性能方面具有巨大的潛力。然而,現有的方法大多致力于開發更復雜的注意力模塊,以實現更好的性能,這不可避免地增加了模型的復雜性。為了克服性能和復雜性之間的矛盾,本文提出了一種有效的通道關注(ECA)模塊,該模塊只增加了少量的參數,卻能獲得明顯的性能增益。通過對SENet中通道注意模塊的分析,作者的經驗表明避免降維對于學習通道注意力非常重要,適當的跨信道交互可以在顯著降低模型復雜度的同時保持性能。因此,作者提出了一種不降維的局部跨信道交互策略,該策略可以通過一維卷積有效地實現。進一步,作者又提出了一種自適應選擇一維卷積核大小的方法,以確定局部跨信道交互的覆蓋率。?實驗證明,本文提出的ECA模塊是高效的(上圖)。
本文模塊(ECA)相對于ResNet50的主干的參數和計算分別是80M比24.37M和4.7e-4 GFLOPs比3.86 GFLOPs,并且性能在Top-1精度方面提升超過2%。本文以ResNets和MobileNetV2為骨干,利用提出的ECA模塊在圖像分類、目標檢測和實例分割方面進行了廣泛的評估。實驗結果表明,該模塊在性能上優于其他模塊,且具有較高的效率。
ECA模塊與其他注意力模塊的比較:這里以ResNets作為骨干模型來進行分類精度,網絡參數和FLOPs的比較,以圓來表示。從上圖可以看出
一.論文簡介(introduction)
深度卷積神經網絡(CNNs)在計算機視覺領域得到了廣泛的應用,在圖像分類、目標檢測和語義分割等領域取得了很大的進展。從開創性的AlexNet開始,為了進一步提高深度cnn的性能,不斷推出新的CNN模型。近年來,將通道注意力引入卷積塊引起了人們的廣泛關注,在性能改進方面顯示出巨大潛力。其中代表性的方法是SENet,它可以學習每個卷積塊的通道注意力,對各種深度CNN架構帶來明顯的性能增益。SENet主要是 squeeze 和 excitation 兩大操作,最近,一些研究通過捕獲更復雜的通道依賴或結合額外的空間注意來改進SE塊。這些方法雖然取得了較高的精度,但往往帶來較高的模型復雜度和較大的計算負擔。與前面提到的以更高的模型復雜度為代價來獲得更好性能的方法不同,本文轉而關注一個問題:能否以更有效的方式學習有效的通道注意力?
為了回答這個問題,我們首先回顧一下SENet中的通道注意模塊。具體來說,在給定輸入特征的情況下,SE塊首先對每個通道單獨使用全局平均池化,然后使用兩個具有非線性的完全連接(FC)層,然后使用一個Sigmoid函數來生成通道權值。兩個FC層的設計是為了捕捉非線性的跨通道交互,其中包括降維來控制模型的復雜性。雖然該策略在后續的通道注意模塊中得到了廣泛的應用,但作者的實驗研究表明,降維對通道注意預測帶來了副作用,捕獲所有通道之間的依賴是低效的,也是不必要的。
SE-net:
?由上圖可知:第一個FC層進行降維(通道數從C--->C/r),第二個FC層又進行了升維(通道數從C/r---->C)
因此,本文提出了一種針對深度CNN的高效通道注意(ECA)模塊,該模塊避免了降維,有效捕獲了跨通道交互的信息。如下圖2所示:
本文在全局平均池化之后不降低通道的維數,通過考慮每個通道及其k個鄰居進行局部跨通道交互信息。實踐證明,該方法保證了模型效率和計算效果。需要注意的是,ECA可以通過大小為k的快速1D卷積來有效實現,其中卷積核大小為k代表了局部跨信道交互的覆蓋率,即,該通道附近有多少鄰居參與了這個信道的注意力預測,為了避免通過交叉驗證對k進行手動調優,本文提出了一種方法來自適應地確定k,其中交互的覆蓋率(即卷積核大小 k)與通道維數成正比。
本文的貢獻如下:
二.提出的方法
在本節中,我們首先重新回顧SENet[14]中的通道注意模塊(即SE塊)。然后,我們通過分析降維和跨通道交互作用的影響,對SE塊進行了實驗判斷。這促使我們提出我們的ECA模塊。此外,我們還開發了一種自適應確定ECA參數的方法,并最后展示了如何將其用于深度cnn。
SE模塊的通道注意力通過如下式1計算:
?接下來介紹一下ECA的模塊,首先由公式2:
為了驗證它的效果,作者比較了原始SE塊和它的三個變體(即 SE-Var1, SE-Var2和SE-Var3),所有這些都沒有進行降維操作。具體效果如下表2所示:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 表2? SE以及ECA結果圖
?對SE進行探索
2.1Avoiding Dimensionality Reduction(避免降維)
為了驗證其效果,我們將原始的SE塊與它的三個變體(即SE-Var1、SE-Var2和SE-Var3)進行了比較,所有這些變體都不執行維度回歸。如上表2所示,沒有參數的SE-Var1仍然優于原始網絡,說明通道注意能夠提高深度cnn的性能。同時,SE-Var2可以獨立學習各通道的權重,略優于SE塊。這可能表明:通道及其權重需要直接對應,同時避免雙敏感性降低比考慮非線性信道依賴性更重要。此外,使用一個單一FC層的SEVar3比在SE塊中降維的兩個FC層性能更好。以上所有的結果都清楚地表明,避免降維有助于學習有效的通道注意,提高準確度。
2.2Local Cross-Channel Interaction(局部跨通道交互)
對于SE-Var2、SE-Var3,權重式分別為:
?
?兩者之間區別在于,SE-Var3考慮了不同通道之間的交互(全局跨通道交互),SE-Var2則沒有(因為Wvar2是一個對角矩陣);但是SE-Var3的需要大量參數,這樣復雜性較高。
作者為了綜合上述兩個方面的優點,將SE-Var2+SE-Var3→ 塊對角矩陣。(如下所示 局部跨通道交互)
Wvar3相當于?W1G,?W2G, W2G,........(局部跨通道交互,表2中SE-GC1,2,3系列)
其中,上式WG將通道C劃分為G組,每個組包括C/G通道,并獨立學習每個組中的通道注意,以局部方式進行跨通道交互。因此,它涉及到C^2/G個參數。從卷積的角度來看,SE-Var2,SEVar3和上式可以分別看作是一個深度可分離的卷積、一個FC層和組卷積(SE-GC)。然而,由上表2可以看出,(SE-GC1,2,3系列)這樣做并沒有給SE-Var2帶來增益,表明它這樣做局部通道交互不能捕獲局部通道之間的相互作用,而且過多的組卷及將層架內存訪問成本,從而降低計算效率。
SE-GC1,2,3系列不起作用的原因可能SE-GC完全拋棄了不同組之間的依賴關系。
2.3? ECA模塊
為此我們探索了另一種捕獲局部跨通道交互的方法(ECA模塊),旨在保證信息效率和有效性。具體地說,我們使用了一個頻帶矩陣Wk來學習信道注意,而Wk已經有了(如下式6)
?其中,Wk涉及K*C個參數,并且Wk避免了不同group的完全獨立,正如在上表2中所示,本文提出的這種方法叫做ECA-NS,他比SE-GC性能要更優。對于yi對應的權重w11,w12....w1k,本文只考慮yi和它的k個鄰居之間的信息交互,計算公式如下:
?為了進一步提高性能,還可以讓所有的通道共享權重信息,即:通過共享相同的學習參數,通過內核大小為k的1維卷積來實現通道之間的信息交互:(一維卷積和1 × 1 卷積是不同的,一維指的是1 × k 的卷積)
?
?C1D代表一維卷積,這種方法稱之為ECA模塊,它只涉及K個參數信息,如上表2,當k=3時,ECA模塊可以實現與SE-Var3同樣的效果但卻有更低的模型復雜度。因此,這種捕捉跨通道信息交互的方法保證了性能結果和模型效率。
2.4Coverage of Local Cross-Channel Interaction(局部跨通道交互覆蓋)
ECA模塊的k如何取值?
上述ECA模塊旨在適當捕獲局部跨道信息交互,因此需要確定通道交互信息的大致范圍(即1D卷積的卷積核大小k)。雖然可以針對各種CNN架構中具有不同通道數的卷積塊進行手動優化設置信息交互的最佳范圍,但是通過手動進行交叉驗證調整將花費大量計算資源。而且分組卷積已成功地用于改善CNN架構,在固定group數量的情況下,高維(低維)通道與長距離(短距離)卷積成正比。同理,跨通道信息交互作用的覆蓋范圍(即一維卷積的內核大小k)與通道維數C應該也是成正比的。換句話說,在k和C之間可能存在映射φ:
最簡單的映射是一個線性函數,即φ(k)=γ?k?b。然而,以線性函數為特征的關系就太有限了。另一方面,眾所周知,通道維度C(即濾波器的數量)通常被設置為2的冪。因此,我們通過將線性函數φ(k)=γ?k?b擴展到非線性函數,引入了一個可能的解,即,
?
然后,給定通道維數C,核大小k可以自適應地確定
卷積尺寸K大小:
其中|t|奇數表示t的最接近奇數。在本文中,我們在所有實驗中分別將γ和b設為2和1。顯然,通過映射ψ,高維通道具有更長的相互作用,而低維通道通過使用非線性映射進行更短的相互作用。?
不同注意力機制結合CNN的結果圖:
作者分別在ImageNet和MS COCO數據集上,對提出的ECA模塊在圖像分類、目標檢測和實例分割方面進行了實驗評估,具體來說,首先評估卷積核大小對ECA模塊的影響,并與ImageNet上最先進的模型進行了比較。然后,將網絡模塊分別結合Faster R-CNN、Mask R-CNN和RetinaNet驗證了在MS COCO數據集上的有效性。
表3比較了不同的注意力方法在ImageNet數據集上的網絡參數(param),浮點運算每秒(FLOPs),訓練或推理速度(幀每秒,FPS), Top-1/Top-5的準確性(%)。
三.實驗結果
k值的影響如下圖表4,ResNet-50和ResNet-101為主干,對照SENet??梢钥闯?#xff0c;ECA-Net相較于SENet,準確率有了極大的提升。
?當k在所有卷積塊中都固定時,對于ResNet-50和ResNet-101, ECA模塊分別在k = 9和k = 5處取得最佳結果。由于ResNet-101有更多的中間層來支配ResNet-101的性能,因此它可能更喜歡較小的卷積核。此外,這些結果表明,不同深度cnn具有不同的最優k值,k值對ECA-Net性能有明顯影響。此外,ResNet-101的準確率波動(約0.5%)要大于ResNet-50的準確率波動(約0.15%),作者推測原因是更深層次的網絡比更淺層次的網絡對固定的卷積核大小更敏感。此外,由映射ψ函數自適應確定的卷積核K大小通常優于固定的卷積核大小,但可以避免通過交叉驗證手動調整參數k。以上結果證明了本文的自適應選擇卷積核大小是可以取得較好且穩定的結果。最后,不同k個數的ECA模塊始終優于SE block,驗證了避免降維和局部跨通道交互對學習通道注意力是有積極作用的。
與不同的CNN對比:
如上表4所示,ECA-Net101的性能優于ResNet-200,這表明ECA-Net可以用更少的計算成本提高深度CNNs的性能。同時,ECA-Net101與ResNeXt-101相比具有更強的競爭力,而ResNeXt-101使用了更多的卷積濾波器和昂貴的群卷積。此外,ECA-Net50可與DenseNet-264 (k=32)、DenseNet-161 (k=48)和 Inception-v3相媲美,但模型復雜度較低。以上結果表明,ECA-Net在性能上優于最先進的CNNs,同時具有更低的模型復雜度。ECA也有很大的潛力來進一步提高CNN模型的性能。?
本文還使用Faster R-CNN[26]、Mask R-CNN[10]和RetinaNet[22]在目標檢測任務上評估ECA-Net。主要將ECA-Net結合骨干ResNet和SENet結合骨干ResNet進行比較。所有的CNN模型都是在ImageNet上預先訓練好的,然后通過在MS COCO數據集上進行微調。具體實驗效果如下所示:
?四.總結
本篇論文作者提出了一種有效的通道注意力(ECA)模塊,該模塊通過快速的一維卷積產生通道注意,其核大小可以通過通道維數的非線性映射自適應地確定。實驗結果表明,我們的ECA是一個非常輕量級的即插即用塊,可以提高各種深度CNN架構的性能,包括廣泛使用的ResNets和輕量級的MobileNetV2。此外,我們的ECA-Net在目標檢測和實例分割任務中表現出良好的泛化能力。
五.ECA模塊的代碼實現
import torch from torch import nn from torch.nn.parameter import Parameterclass eca_layer(nn.Module):"""Constructs a ECA module.Args:channel: Number of channels of the input feature mapk_size: Adaptive selection of kernel size"""def __init__(self, channel, k_size=3):super(eca_layer, self).__init__()self.avg_pool = nn.AdaptiveAvgPool2d(1)self.conv = nn.Conv1d(1, 1, kernel_size=k_size, padding=(k_size - 1) // 2, bias=False)self.sigmoid = nn.Sigmoid()def forward(self, x):# x: input features with shape [b, c, h, w]b, c, h, w = x.size()# feature descriptor on the global spatial informationy = self.avg_pool(x)# Two different branches of ECA moduley = self.conv(y.squeeze(-1).transpose(-1, -2)).transpose(-1, -2).unsqueeze(-1)# Multi-scale information fusiony = self.sigmoid(y)return x * y.expand_as(x)總結
以上是生活随笔為你收集整理的即插即用的轻量注意力机制ECA--Net的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BM39 序列化二叉树
- 下一篇: 学习能力和工作态度是准绳