日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

SENetSKNet 解读

發(fā)布時(shí)間:2024/4/11 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SENetSKNet 解读 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

簡(jiǎn)介

今年有很多基于 ResNet 的新成果誕生,包括由于代碼實(shí)現(xiàn)錯(cuò)誤等問(wèn)題引起廣泛關(guān)注卻屠榜各個(gè)榜單的 ResNeSt,關(guān)于 ResNeSt 的好壞這里不多做評(píng)論,不過(guò)它基于的前人工作 SENet 和 SKNet 其實(shí)是很值得回顧的,本文就聊聊這兩個(gè)卷積神經(jīng)網(wǎng)絡(luò)歷史上標(biāo)桿式的作品。

  • SENet: Squeeze-and-Excitation Networks(CVPR2018)
  • SKNet: Selective Kernel Networks(CVPR2019)

SENet

SENet 獲得了 ImageNet2017 大賽分類(lèi)任務(wù)的冠軍,這也是最后一屆 ImageNet 比賽,論文同時(shí)獲得了 CVPR2018 的 oral。而且,SENet 思路簡(jiǎn)單,實(shí)現(xiàn)方便,計(jì)算量小,模塊化涉及,可以無(wú)縫嵌入主流的網(wǎng)絡(luò)結(jié)構(gòu)中,實(shí)踐不斷證明其可以使得網(wǎng)絡(luò)獲得更好的任務(wù)效果。

動(dòng)機(jī)和思路

我們知道,卷積操作是卷積神經(jīng)網(wǎng)絡(luò)的核心,卷積可以理解為在一個(gè)局部感受野范圍內(nèi)將空間維度信息和特征維度信息進(jìn)行聚合,聚合的方式是加和(sum)。然后想要提高卷積神經(jīng)網(wǎng)絡(luò)的性能其實(shí)是很難的,需要克服很多的難點(diǎn)。為了獲得更加豐富的空間信息,很多工作被提出,如使用多尺度信息聚合的 Inception(下面左圖,圖來(lái)自官方分享)、考慮空間上下文的 Inside-outside Network(下面右圖)以及一些注意力機(jī)制。

那么,自然會(huì)想到,能否在通道(channel)維度上進(jìn)行特征融合呢?首先,其實(shí)卷積操作默認(rèn)是有隱式的通道信息融合的,它對(duì)所有通道的特征圖進(jìn)行融合得到輸出特征圖(這就默認(rèn)每個(gè)通道的特征是同權(quán)的),這就是為什么一個(gè) 32 通道的輸入特征圖,要求輸出 64 通道特征圖,需要 32x64 個(gè)卷積核。這方面也不是沒(méi)人進(jìn)行嘗試,一些輕量級(jí)網(wǎng)絡(luò)使用分組卷積和深度可分離卷積對(duì) channel 進(jìn)行分組操作,而這本質(zhì)上只是為了減少參數(shù),并沒(méi)有什么特征融合上的貢獻(xiàn)。

SENet 則從每個(gè)通道的特征圖應(yīng)該不同權(quán)角度出發(fā),更加關(guān)注 channel 之間的關(guān)系,讓模型學(xué)習(xí)到不同 channel 的重要程度從而對(duì)其加權(quán),即顯式建模不同 channel 之間的關(guān)系。為此,設(shè)計(jì)了 SE(Squeeze-and-Excitation)模塊,我這邊譯作壓縮激勵(lì)模塊,不過(guò)后文還是采用 SE 進(jìn)行闡述。

結(jié)構(gòu)設(shè)計(jì)

下圖就是 SE 模塊的結(jié)構(gòu)圖,對(duì)輸入XXX進(jìn)行一系列卷積變換Ftr\mathbf{F}_{t r}Ftr?后得到UUU,維度也從(C′,H′,W′)(C',H',W')(C,H,W)變?yōu)?span id="ozvdkddzhkzd" class="katex--inline">(C,H,W)(C,H,W)(C,H,W)。這里假定Ftr\mathbf{F}_{t r}Ftr?就是一個(gè)卷積操作,并且卷積核為V=[v1,v2,…,vC]\mathbf{V}=\left[\mathbf{v}_{1}, \mathbf{v}_{2}, \ldots, \mathbf{v}_{C}\right]V=[v1?,v2?,,vC?]vc\mathbf{v}_{c}vc?表示第ccc個(gè)卷積核的參數(shù),那么輸出U=[u1,u2,…,uC]\mathbf{U}=\left[\mathbf{u}_{1}, \mathbf{u}_{2}, \ldots, \mathbf{u}_{C}\right]U=[u1?,u2?,,uC?],這種表示源于下式,這個(gè)不難理解,其中?*?表示卷積運(yùn)算。

uc=vc?X=∑s=1C′vcs?xs\mathbf{u}_{c}=\mathbf{v}_{c} * \mathbf{X}=\sum_{s=1}^{C^{\prime}} \mathbf{v}_{c}^{s} * \mathbf{x}^{s} uc?=vc??X=s=1C?vcs??xs

上面的式子說(shuō)明了一個(gè)什么問(wèn)題呢?一個(gè)卷積核到輸入 feature map 的每一個(gè) channel 上進(jìn)行了操作然后加和在一起,channel 特征和卷積核學(xué)到的空間特征混雜糾纏在了一起。這就是說(shuō),默認(rèn)卷積操作建模的通道之間的關(guān)系是隱式和局部的。作者希望顯示建模通道之間的依賴(lài)關(guān)系來(lái)增強(qiáng)卷積特征的學(xué)習(xí)。因此,論文希望提供全局信息捕獲的途徑并且重標(biāo)定卷積結(jié)果,所以設(shè)計(jì)了兩個(gè)操作壓縮(squeeze)激勵(lì)(excitation)。

上圖就是 SE 模塊的結(jié)構(gòu),我們先來(lái)看看壓縮操作。卷積是在一個(gè)局部感受野范圍內(nèi)操作,因此UUU很難獲得足夠的信息來(lái)捕獲全局的通道之間的關(guān)系。所以這里通過(guò)壓縮全局空間信息為一個(gè)通道特征的操作,論文中采用全局平均池化(GAP)來(lái)實(shí)現(xiàn)這個(gè)目的,具體的z∈RC\mathbf{z} \in \mathbb{R}^{C}zRC通過(guò)下式計(jì)算,通過(guò)在H×WH\times WH×W維度上壓縮UUU得到。

zc=Fsq(uc)=1H×W∑i=1H∑j=1Wuc(i,j)z_{c}=\mathbf{F}_{s q}\left(\mathbf{u}_{c}\right)=\frac{1}{H \times W} \sum_{i=1}^{H} \sum_{j=1}^{W} u_{c}(i, j) zc?=Fsq?(uc?)=H×W1?i=1H?j=1W?uc?(i,j)

激勵(lì)操作需要利用壓縮操作得到的全局描述來(lái)抓取 channel 之間的關(guān)系,所以激勵(lì)操作必須滿足兩個(gè)特性:靈活,它要能捕獲通道間的非線性關(guān)系;不互斥,我們希望多個(gè)通道都被增強(qiáng)或者多個(gè)通道被抑制而不是要得到 one-hot 那樣的結(jié)果。所以采用下述的簡(jiǎn)單 gating 機(jī)制,其中W1∈RCr×C,W2∈RC×CrW_{1} \in R^{\frac{C}{r} \times C}, W_{2} \in R^{C \times \frac{C}{r}}W1?RrC?×C,W2?RC×rC?。

s=Fex(z,W)=σ(g(z,W))=σ(W2δ(W1z))\mathbf{s}=\mathbf{F}_{e x}(\mathbf{z}, \mathbf{W})=\sigma(g(\mathbf{z}, \mathbf{W}))=\sigma\left(\mathbf{W}_{2} \delta\left(\mathbf{W}_{1} \mathbf{z}\right)\right) s=Fex?(z,W)=σ(g(z,W))=σ(W2?δ(W1?z))

為了降低模型復(fù)雜度以及提升泛化能力,這里采用兩個(gè)全連接層構(gòu)成 bottleneck 的結(jié)構(gòu),其中第一個(gè)全連接層起到降維的作用,降維比例rrr是個(gè)超參數(shù),然后采用 ReLU 激活,然后第二個(gè)全連接層用于恢復(fù)特征維度最后 Sigmoid 激活輸出,顯然輸出s\mathbf{s}s是一個(gè)CCC維的向量,它表征了各個(gè) channel 的重要性且值在(0,1)(0,1)(0,1)之間,將這個(gè)s\mathbf{s}s逐通道乘上輸入UUU即可,這相當(dāng)于對(duì)每個(gè) channel 加權(quán),這種操作類(lèi)似什么呢?Attention。

x~c=Fscale(uc,sc)=scuc\widetilde{\mathbf{x}}_{c}=\mathbf{F}_{\text {scale}}\left(\mathbf{u}_{c}, s_{c}\right)=s_{c} \mathbf{u}_{c} xc?=Fscale?(uc?,sc?)=sc?uc?

結(jié)構(gòu)應(yīng)用

SE 模塊可以無(wú)縫嵌入到主流的網(wǎng)絡(luò)結(jié)構(gòu)中,以 Inception 和 ResNet 為例,改造前后的結(jié)構(gòu)如下圖,Inception 比較直白,右邊的殘差網(wǎng)絡(luò)則將 SE 模塊直接嵌入殘差單元中。當(dāng)然,其在 ResNetXt,Inception-ResNet,MobileNet 和 ShuffleNet 等結(jié)構(gòu)基礎(chǔ)上也可以嵌入。

而且,經(jīng)過(guò)分析可以得知,SE 模塊算力增加并不大,在 ResNet50 上,雖然增加了約 10%的參數(shù)量,但計(jì)算量(GFLOPS)卻增加不到 1%。

作者也在主流任務(wù)上測(cè)試了 SE 模塊的適用性,基本上在各個(gè)任務(wù)上都有漲點(diǎn),感興趣的可以查看原論文,不過(guò)其能獲得 ImageNet2017 的冠軍已經(jīng)說(shuō)明了 SE 模塊的強(qiáng)大。而且其實(shí)現(xiàn)也是非常簡(jiǎn)單的,基本的 SE 模塊的 PyTorch 實(shí)現(xiàn)如下(參考開(kāi)源鏈接)。

class SELayer(nn.Module):def __init__(self, channel, reduction=16):super(SELayer, self).__init__()self.avg_pool = nn.AdaptiveAvgPool2d(1)self.fc = nn.Sequential(nn.Linear(channel, channel // reduction, bias=False),nn.ReLU(inplace=True),nn.Linear(channel // reduction, channel, bias=False),nn.Sigmoid())def forward(self, x):b, c, _, _ = x.size()y = self.avg_pool(x).view(b, c)y = self.fc(y).view(b, c, 1, 1)return x * y.expand_as(x)

SKNet

SENet 設(shè)計(jì)了 SE 模塊來(lái)提升模型對(duì) channel 特征的敏感性,CVPR2019 的 SKNet 和 SENet 非常相似,它主要是為了提升模型對(duì)感受野的自適應(yīng)能力,這種自適應(yīng)能力類(lèi)似 SENet 對(duì)各個(gè)通道做類(lèi)似 attention,只不過(guò)是對(duì)不同尺度的卷積分支做了這種 attention。

動(dòng)機(jī)和思路

我們?cè)O(shè)計(jì)卷積神經(jīng)網(wǎng)絡(luò)的時(shí)候參考了動(dòng)物的視覺(jué)機(jī)制,但是一個(gè)重要的思路并沒(méi)有在設(shè)計(jì)卷積神經(jīng)網(wǎng)絡(luò)時(shí)被過(guò)多關(guān)注,那就是感受野的尺寸是根據(jù)刺激自動(dòng)調(diào)節(jié)的,SKNet就從這個(gè)思路出發(fā),自適應(yīng)選擇更重要的卷積核尺寸(這個(gè)實(shí)現(xiàn)其實(shí)就是對(duì)不同尺度的特征圖分別加權(quán),這個(gè)權(quán)重由網(wǎng)絡(luò)學(xué)習(xí)得到,這就是我為什么說(shuō)和SENet很類(lèi)似的原因)。

首先,我們考慮如何獲得不同尺寸的感受野信息呢,一個(gè)非常直接的想法就是使用不同size的卷積核,然后把他們?nèi)诤掀饋?lái)就行了,這個(gè)思路誕生了下圖的Inception網(wǎng)絡(luò),不過(guò),Inception將所有分支的多尺度信息線性聚合到了一起,這也許是不合適的,因?yàn)椴煌某叨鹊男畔⒂兄煌闹匾潭?#xff0c;網(wǎng)絡(luò)應(yīng)該自己學(xué)到這種重要程度(看到這是不是覺(jué)得和SENet針對(duì)的不同通道信息應(yīng)該有不同重要程度有類(lèi)似之處)。

所以,這篇論文,作者設(shè)計(jì)了一種非線性聚合不同尺度的方法來(lái)實(shí)現(xiàn)自適應(yīng)感受野,引入的這種操作稱(chēng)為SK卷積(Selective Kernel Convolution),它包含三個(gè)操作:Split、Fuse和Select。Split操作很簡(jiǎn)單,通過(guò)不同的卷積核size產(chǎn)生不同尺度的特征圖;Fuse操作則通過(guò)聚合不同尺度的信息產(chǎn)生全局的選擇權(quán)重;最后的Select操作通過(guò)這個(gè)選擇權(quán)重來(lái)聚合不同的特征圖。SK卷積可以嵌入主流的卷積神經(jīng)網(wǎng)絡(luò)之中且只會(huì)帶來(lái)很少的計(jì)算量,其在大規(guī)模的ImageNet和小規(guī)模的CIFAR-10上都超越了SOTA方法。

結(jié)構(gòu)設(shè)計(jì)

在具體了解SKNet之前,必須知道不少的前置知識(shí),比如多分支卷積神經(jīng)網(wǎng)絡(luò)(不同size的卷積核特征融合)、分組卷積及深度可分離卷積及膨脹卷積(減少運(yùn)算量的高效卷積方式)、注意力機(jī)制(增強(qiáng)網(wǎng)絡(luò)的重點(diǎn)關(guān)注能力),這些我這邊就不多做解釋了。

上圖就是SK卷積的一個(gè)基礎(chǔ)實(shí)現(xiàn),為了方便描述,作者只采用了兩個(gè)分支,事實(shí)上可以按需增加分支,原理是一樣的??梢钥吹?#xff0c;從左往右分別是三個(gè)part:Split、Fuse和Select,下面我就一步步來(lái)解釋這三個(gè)操作是如何獲得自適應(yīng)感受野信息的,解釋是完全對(duì)照上面這個(gè)圖來(lái)的。

Split:對(duì)給定的特征圖X∈RH′×W′×C′\mathbf{X} \in \mathbb{R}^{H^{\prime} \times W^{\prime} \times C^{\prime}}XRH×W×C,對(duì)其采用兩種卷積變換F~:X→U~∈RH×W×C\widetilde{\mathcal{F}}: \mathbf{X} \rightarrow \tilde{\mathbf{U}} \in \mathbb{R}^{H \times W \times C}F:XU~RH×W×CX→U^∈RH×W×C\mathbf{X} \rightarrow \widehat{\mathbf{U}} \in \mathbb{R}^{H \times W \times C}XURH×W×C,它們只有卷積核size不同(這里以3和5為例),其余配置一致(卷積采用深度可分離卷積,5x5卷積采用3x3卷進(jìn)進(jìn)行膨脹)。這一步,通過(guò)兩個(gè)變換構(gòu)建了兩個(gè)感受野的分支,形成了兩個(gè)特征圖U~\tilde{\mathbf{U}}U~U^\widehat{\mathbf{U}}U,它們的維度都是H×W×CH\times W \times CH×W×C。

Fuse:這一步也就是自適應(yīng)感受野的核心,這里采用最簡(jiǎn)單的gates機(jī)制控制進(jìn)入下一層的多尺度信息流。因此,這個(gè)gates需要集成來(lái)自所有分支的信息,還要有權(quán)重的集成。首先,通過(guò)逐元素相加獲得特征圖U\mathbf{U}UU=U~+U^\mathbf{U}=\tilde{\mathbf{U}}+\widehat{\mathbf{U}}U=U~+U),然后采用SENet類(lèi)似的思路,通過(guò)GAP生成逐通道的統(tǒng)計(jì)信息s∈RC\mathbf{s} \in \mathbb{R}^{C}sRC,計(jì)算式如下。

sc=Fgp(Uc)=1H×W∑i=1H∑j=1WUc(i,j)s_{c}=\mathcal{F}_{g p}\left(\mathbf{U}_{c}\right)=\frac{1}{H \times W} \sum_{i=1}^{H} \sum_{j=1}^{W} \mathbf{U}_{c}(i, j) sc?=Fgp?(Uc?)=H×W1?i=1H?j=1W?Uc?(i,j)

接著,為了更緊湊的表示,通過(guò)一個(gè)全連接層對(duì)s\mathbf{s}s進(jìn)行降維,獲得z=Ffc(s)=δ(B(Ws))\mathbf{z}=\mathcal{F}_{f c}(\mathbf{s})=\delta(\mathcal{B}(\mathbf{W} \mathbf{s}))z=Ffc?(s)=δ(B(Ws)),這里先是和W∈Rd×C\mathbf{W} \in \mathbb{R}^{d \times C}WRd×C相乘然后經(jīng)過(guò)BN和ReLU,ddd作為一個(gè)超參使用下降比rrr來(lái)控制,不過(guò)ddd同時(shí)通過(guò)下面的式子約束下界(LLL設(shè)置為32)。接著,又一個(gè)全連接用于升維度,得到分支數(shù)個(gè)CCC維向量,論文中這里就是aaabbb,然后按照通道維度進(jìn)行soft attention,也就是說(shuō)ac+bc=1a_{c}+b_{c}=1ac?+bc?=1,這樣可以反映不同尺度的特征的重要性,然后用aaabbb采用類(lèi)似SE的方式對(duì)原始特征圖U~\tilde{\mathbf{U}}U~U^\widehat{\mathbf{U}}U進(jìn)行逐通道相乘加權(quán),得到有通道區(qū)分度的特征圖,再相加到一起得到輸出特征圖V\mathbf{V}V。這個(gè)特征圖,就是自適應(yīng)不同感受野獲得的特征圖。

d=max?(C/r,L)d=\max (C / r, L) d=max(C/r,L)

結(jié)構(gòu)應(yīng)用

將SK卷積應(yīng)用到ResNeXt50中,得到SKNet50,具體配置如下圖,在主流任務(wù)上都有突破。SK卷積也適用于輕量級(jí)網(wǎng)絡(luò),因?yàn)槠洳粫?huì)帶來(lái)多少算力增加。

SK卷積的PyTorch實(shí)現(xiàn)如下(參考開(kāi)源鏈接)。

class SKConv(nn.Module):def __init__(self,in_channels,out_channels,stride=1,M=2,r=16,L=32):super(SKConv,self).__init__()d=max(in_channels//r,L)self.M=Mself.out_channels=out_channelsself.conv=nn.ModuleList()for i in range(M):self.conv.append(nn.Sequential(nn.Conv2d(in_channels,out_channels,3,stride,padding=1+i,dilation=1+i,groups=32,bias=False),nn.BatchNorm2d(out_channels),nn.ReLU(inplace=True)))self.global_pool=nn.AdaptiveAvgPool2d(1)self.fc1=nn.Sequential(nn.Conv2d(out_channels,d,1,bias=False),nn.BatchNorm2d(d),nn.ReLU(inplace=True))self.fc2=nn.Conv2d(d,out_channels*M,1,1,bias=False)self.softmax=nn.Softmax(dim=1)def forward(self, input):batch_size=input.size(0)output=[]# the part of splitfor i,conv in enumerate(self.conv):output.append(conv(input))# the part of fuseU=reduce(lambda x,y:x+y,output)s=self.global_pool(U)z=self.fc1(s)a_b=self.fc2(z)a_b=a_b.reshape(batch_size,self.M,self.out_channels,-1)a_b=self.softmax(a_b)# the part of selecta_b=list(a_b.chunk(self.M,dim=1))#split to a and ba_b=list(map(lambda x:x.reshape(batch_size,self.out_channels,1,1),a_b))V=list(map(lambda x,y:x*y,output,a_b))V=reduce(lambda x,y:x+y,V)return V

總結(jié)

SENet和SKNet分別從通道信息和感受野自適應(yīng)角度出發(fā),設(shè)計(jì)了一個(gè)新的網(wǎng)絡(luò)結(jié)構(gòu),獲得了比較有突破的成果,SKNet是SENet基礎(chǔ)上的工作,還集成了近幾年卷積神經(jīng)網(wǎng)絡(luò)的一些主流技巧,可以說(shuō)集眾家之長(zhǎng),也可以說(shuō)是人工設(shè)計(jì)卷積神經(jīng)網(wǎng)絡(luò)的集大成者了,SKNet后來(lái)的很多效果更好的卷積神經(jīng)網(wǎng)絡(luò)或多或少帶有NAS技術(shù)的影子,不過(guò),自動(dòng)搜索也是不可阻擋的未來(lái)趨勢(shì)。

總結(jié)

以上是生活随笔為你收集整理的SENetSKNet 解读的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。