通道注意力新突破!从频域角度出发,浙大提出FcaNet:仅需修改一行代码,简洁又高效
該文是浙江大學提出一種的新穎的通道注意力機制,它將通道注意力機制與DCT進行了巧妙的結合,并在常規(guī)的通道注意力機制上進行了擴展得到了本文所提出的多譜通道注意力機制:FcaLayer。作者在圖像分類、目標檢測以及實例分割等任務上驗證了所提方案的有效性:在ImageNet分類任務上,相比SENet50,所提方法可以取得1.8%的性能提升。
Abstract
注意力機制(尤其是通道注意力)在CV領域取得了極大的成功,然這些工作往往聚焦于如何設計有效的通道注意力機制同時采用GAP(全局均值池化)作為預處理方法。本文從另一個角度出發(fā):從頻域角度分析通道注意力機制。基于頻域分析,作者得出:GAP是頻域特征分解的一種特例。
基于前述分析,作者對通道注意力機制的預處理部分進行了擴展并提出了帶多譜通道注意力的FcaNet,所提方法具有簡單&有效性。在現(xiàn)有通道注意力機制的實現(xiàn)基礎上,僅需更改一行code即可實現(xiàn)所提的注意力機制。
更進一步,在圖像分類、目標檢測以及實例分割任務上,相比其他注意力機制,所提方法取得了更好的性能。比如在ImageNet數(shù)據(jù)集上,所提方法比SE-ResNet50的Top1指標高1.8%,且兩者具有相同的參數(shù)量與計算量。
上圖給出了所提方法與ResNet、SE-ResNet在ImageNet數(shù)據(jù)集上的指標對比。本文的主要貢獻包含以下幾點:
- 證實GAP是DCT的一種特例,基于該分析對通道注意力機制在頻域進行了擴展并提出了帶多譜通道注意力的FcaNet;
- 通過探索不同數(shù)量頻域成分的有效性提出了一種“two-step”準則選擇頻域成分;
- 通過實驗證實了所提方法的有效性,在ImageNet與COCO數(shù)據(jù)集上均取得了優(yōu)于SENet的性能;
- 所提方法簡介有效,僅需在現(xiàn)有通道注意力機制的基礎上修改一行code即可實現(xiàn)。
Method
接下來,我們將重新研究一下通道注意力的架構以及DCT頻域分析;基于前述分析推導多譜通道注意力網(wǎng)絡;與此同時,提出一種“two-step”準則選擇頻域成分;最后給出了關于有效性、復雜度的討論與code實現(xiàn)。
Revisiting Channels Attention and DCT
我們先來看一下通道注意力與DCT的定義,然后在總結對比一下兩者的屬性。
Channel Attention
通道注意力機制已被廣泛應用到CNN網(wǎng)絡架構中,它采用一個可學習的網(wǎng)絡預測每個通道的重要。其定義如下:
att=sigmoid(fc(gap(X)))att = sigmoid(fc(gap(X))) att=sigmoid(fc(gap(X)))
X~:,i,:,:=attiX:,i,:,:,s.t.i∈{0,1,?,C?1}\tilde{X}_{:,i,:,:} = att_i X_{:,i,:,:}, s.t. i\in \{0,1,\cdots, C-1\}X~:,i,:,:?=atti?X:,i,:,:?,s.t.i∈{0,1,?,C?1}
Discrete Cosine Transform
DCT的定義如下:
fk=∑i=0L?1xicos(πkL(i+0.5)),s.t.k∈{0,1,?,L?1}f_k = \sum_{i=0}^{L-1} x_i cos(\frac{\pi k}{L}(i + 0.5)), s.t. k \in \{0,1,\cdots, L-1\} fk?=i=0∑L?1?xi?cos(Lπk?(i+0.5)),s.t.k∈{0,1,?,L?1}
其中f∈RLf\in R^Lf∈RL表示DCT的頻譜。2D-DCT的定義如下:
fh,w2d=∑i=0H?1∑j=0W?1xi,j2dcos(πhH(i+0.5))cos(πwW(j+0.5))f^{2d}_{h,w} = \sum_{i=0}^{H-1} \sum_{j=0}^{W-1} x_{i,j}^{2d}cos(\frac{\pi h}{H}(i + 0.5))cos(\frac{\pi w}{W}(j + 0.5)) fh,w2d?=i=0∑H?1?j=0∑W?1?xi,j2d?cos(Hπh?(i+0.5))cos(Wπw?(j+0.5))
s.t.h∈{0,1,?,H?1},w∈{0,1,?,W?1}s.t. h\in \{0,1,\cdots, H-1\}, w \in \{0,1,\cdots, W-1\} s.t.h∈{0,1,?,H?1},w∈{0,1,?,W?1}
其中,fh,w2df^{2d}_{h,w}fh,w2d?表示2D-DCT頻譜。對應的2D-IDCT的定義如下:
xi,j2d=∑h=0H?1∑w=0W?1fh,w2dcos(πhH(i+0.5))cos(πwW(j+0.5))x_{i,j}^{2d} = \sum_{h=0}^{H-1} \sum_{w=0}^{W-1} f^{2d}_{h,w} cos(\frac{\pi h}{H}(i + 0.5))cos(\frac{\pi w}{W}(j + 0.5)) xi,j2d?=h=0∑H?1?w=0∑W?1?fh,w2d?cos(Hπh?(i+0.5))cos(Wπw?(j+0.5))
s.t.i∈{0,1,?,H?1},j∈{0,1,?,W?1}s.t. i\in \{0,1,\cdots, H-1\}, j \in \{0,1,\cdots, W-1\} s.t.i∈{0,1,?,H?1},j∈{0,1,?,W?1}
注:在上述兩個公式中常數(shù)項被移除掉了。
基于上述通道注意力與DCT的定義,我們可以總結得到以下兩點關鍵屬性:(1) 現(xiàn)有的通道注意力方案采用GAP作為預處理;(2) DCT可以視作輸入與其cosine部分的加權。GAP可以視作輸入的最低頻信息,而在通道注意力中僅僅采用GAP是不夠充分的。基于此,作者引入了本文的多譜通道注意力方案。
Multi-Spectral Channel Attention
在正式引出多譜通道注意力之前,作者首先給出了一個定理,如下所示。其中f0,02df_{0,0}^{2d}f0,02d?表示D2-DCT的最低頻成分。
上述定理意味著:通道注意力機制中可以引入其他頻域成分。與此同時,作者也解釋了為什么有必要引入其他頻率成分。
為簡單起見,我們采用B表示2D-DCT的基函數(shù):
Bh,wi,j=cos(πhH(i+0.5))cos(πwW(j+0.5))B_{h, w}^{i,j} = cos(\frac{\pi h}{H}(i + 0.5))cos(\frac{\pi w}{W}(j + 0.5)) Bh,wi,j?=cos(Hπh?(i+0.5))cos(Wπw?(j+0.5))
那么,2D-DCT可以重寫成如下形式:
自然地,我們可以看到:圖像/特征可以表示為不同頻率成分的線性組合。再來看通道注意力的公式:att=sigmoid(fc(gap(X)))att = sigmoid(fc(gap(X)))att=sigmoid(fc(gap(X))),即通道注意力僅僅依賴于GAP結果。而X的信息卻不僅僅由GAP構成:
X=gap(X)HWB0,0i,j+f0,12dB0,1i,j+?+fH?1,W?12dBH?1,W?1i,jX = gap(X)HW B_{0,0}^{i,j} + f_{0,1}^{2d}B_{0,1}^{i,j} + \cdots + f_{H-1, W-1}^{2d} B_{H-1, W-1}^{i,j} X=gap(X)HWB0,0i,j?+f0,12d?B0,1i,j?+?+fH?1,W?12d?BH?1,W?1i,j?
從上述公式可以看到:僅有一小部分信息在通道注意力中得以應用,而其他頻域成分則被忽略了。
Multi-Spectral Attention Module
基于上述分析,作者很自然的將GAP擴展為2D-DCT的更多頻率成分的組合,即引入更多的信息解決通道注意力中的信息不充分問題。
首先,輸入X沿通道維劃分為多個部分[X0,X1,?,Xn?1][X^0,X^1,\cdots, X^{n-1}][X0,X1,?,Xn?1];對于每個部分,計算其2D-DCT頻率成分并作為通道注意力的預處理結果。此時有:
Freqi=2DDCTu,v(Xi)=∑h=0H?1∑w=0W?1X:.h,wiBh,wu,vFreq^i = 2DDCT^{u,v}(X^i) = \sum_{h=0}^{H-1} \sum_{w=0}^{W-1} X_{:.h,w}^{i} B_{h,w}^{u,v} Freqi=2DDCTu,v(Xi)=h=0∑H?1?w=0∑W?1?X:.h,wi?Bh,wu,v?
s.t.i∈{0,1,?,n?1}s.t. i\in \{0,1,\cdots, n-1\} s.t.i∈{0,1,?,n?1}
將上述頻域成分通過concat進行組合,
Freq=cat([Freq0,Freq1,?,Freqn?1])Freq = cat([Freq^0, Freq^1, \cdots, Freq^{n-1}]) Freq=cat([Freq0,Freq1,?,Freqn?1])
真?zhèn)€多譜通道注意力機制與描述如下:
msatt=sigmoid(fc(Freq))ms_att = sigmoid(fc(Freq)) msa?tt=sigmoid(fc(Freq))
下圖給出了通道注意力與多譜通道注意力之間的網(wǎng)絡架構對比示意圖。
Criterion for choosing frequence components
從前述定義可以看到:2D-DCT有多個頻率成分,那么如何選擇合適的頻率成分呢?作者提出一種“two-step”準則選擇多譜注意力中的頻率成分。
選擇的主旨在于:首先確定每個頻率成分的重要性,然后確定不同數(shù)量頻率成分的影響性。首先,獨立的確認每個通道的不同頻率成分的結果,然后選擇Top-k高性能頻率成分。
最后,作者提供了本文所提多譜通道注意力的實現(xiàn)code,如下所示。可以看到:僅需在forward部分修改一行code即可。
Experiments
ImageNet
作者選用了四個廣泛采用的CNN作為骨干網(wǎng)絡,即ResNet34,ResNet50,ResNet101,ResNet152。采用了類似ResNet的數(shù)據(jù)增強與超參配置:輸入分辨率為224×224224\times 224224×224,SGD優(yōu)化器,Batch=128,合計訓練100epoch,cosine學習率。注:采用Apex混合精度訓練工具。
COCO
作者選用了Faster RNN與Mask RCNN作為基準,并采用了MMDetection工具進行實現(xiàn)。SGD優(yōu)化器,每個GPU的batch=2。訓練12個epoch,學習率為0.01,在第8和11epoch時學習率衰減。
作者首先給出了不同頻率成分下的通道注意力的性能對比,見下圖。可以看到:(1) 多譜注意力以較大優(yōu)勢超越僅采用GAP的通道注意力;(2) 包含16個頻率成分的注意力取得最佳性能。
下表給出了所提方法在ImageNet數(shù)據(jù)集上與其他方法的性能對比。可以看到:所提方案FcaNet取得了最佳的性能。在相同參數(shù)&計算量下,所提方法以較大優(yōu)化超過SENet,分別高出1.20%、1.81%、2.02%、1.65%;與此同時,FcaNet取得了超過GSoPNet的性能,而GSopNet的計算量比FcaNet更高。
下圖給出了COCO目標檢測任務上的性能對比,可以看到:所提方法取得了更佳的性能。FcaNet以較大的性鞥呢優(yōu)勢超過了SENet;相比ECANet,FcaNet仍能以0.9-1.3%指標勝出。
下圖給出了COCO實例分割任務上的性能對比,可以看到:所提方法以較大優(yōu)勢勝出。比如,FcaNet以0.5%AMP指標優(yōu)于GCNet。
全文到此結束,更多消融實驗分析建議查看原文。最后附上多譜通道注意力code。注:get_dct_weights僅用于初始化dct權值,而不會參與訓練和測試。很明顯,這里的多譜通道注意力是一種與特征寬高相關的通道注意力機制,這有可能導致其在尺寸可變任務(比如圖像復原中的訓練數(shù)據(jù)-測試數(shù)據(jù)的尺寸不一致)上的不適用性。
import math import torch import torch.nn as nndef get_ld_dct(i, freq, L):result = math.cos(math.pi * freq * (i + 0.5) / L)if freq == 0:return resultelse:return result * math.sqrt(2)def get_dct_weights(width, height, channel, fidx_u, fidx_v):dct_weights = torch.zeros(1, channel, width, height)# split channel for multi-spectral attentionc_part = channel // len(fidx_u)for i, (u_x, v_y) in enumerate(zip(fidx_u, fidx_v)):for t_x in range(width):for t_y in range(height):val = get_ld_dct(t_x, u_x, width) * get_ld_dct(t_y, v_y, height)dct_weights[:, i * c_part: (i+1) * c_part, t_x, t_y] = valreturn dct_weightsclass FcaLayer(nn.Module):def __init__(self, channels, reduction=16):super(FcaLayer, self).__init__()self.register_buffer("precomputed_dct_weights", get_dct_weights(...))self.fc = nn.Sequential(nn.Linear(channels, channels//reduction, bias=False),nn.ReLU(inplace=True),nn.Linear(channels//reduction, channels, bias=False),nn.Sigmoid())def forward(self, x):n,c,_,_ = x.size()y = torch.sum(x * self.pre_computed_dct_weights, dim=[2,3])y = self.fc(y).view(n,c,1,1)return x * y.expand_as(x)◎作者檔案
Happy,一個愛“胡思亂想”的AI行者
歡迎大家聯(lián)系極市小編(微信ID:fengcall19)加入極市原創(chuàng)作者行列
總結
以上是生活随笔為你收集整理的通道注意力新突破!从频域角度出发,浙大提出FcaNet:仅需修改一行代码,简洁又高效的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 英特尔® OpenVINO™中级认证正式
- 下一篇: Batchsize不够大,如何发挥BN性