SE注意力机制
SENet-通道注意力筆記
- 簡(jiǎn)介
- 意義
- 目的:
- 主要操作
- 算法流程圖
- 過(guò)程
- 第一步、
- 第二步、
- 第三步、
- 第四步、
- SE模塊的結(jié)構(gòu)圖
- 實(shí)現(xiàn)代碼
- 最后
簡(jiǎn)介
SENet是2017年ImageNet比賽的冠軍,2018年CVPR引用量第一。論文鏈接:SENet
意義
較早的將attention引入到CNN中,模塊化化設(shè)計(jì)。
目的:
SE模塊的目的是想通過(guò)一個(gè)權(quán)重矩陣,從通道域的角度賦予圖像不同位置不同的權(quán)重,得到更重要的特征信息。
主要操作
SE模塊的主要操作:擠壓(Squeeze)、激勵(lì)(Excitation)
算法流程圖
通過(guò)一系列操作得到一個(gè)1?1?C1*1*C1?1?C的權(quán)重矩陣,對(duì)原特征進(jìn)行重構(gòu)(不同顏色表示不同的數(shù)值,用來(lái)衡量通道的重要性)
過(guò)程
第一步、
Transformation (Ftr)(F{_t}{_r})(Ft?r?):給定一個(gè)input特征圖XXX,讓其經(jīng)過(guò)FtrF{_t}{_r}Ft?r?操作生成特征圖UUU。
注意:在常用的卷積神經(jīng)網(wǎng)絡(luò)中Transformation操作一般為一個(gè)卷積操作。我們通常在聊SE注意力時(shí)通常不包含這一步。
第二步、
Squeeze(Fsq(?))(F{_s}{_q}(·))(Fs?q?(?))::這一步將特征圖進(jìn)行全局平均池化,生成一個(gè)1?1?C1*1*C1?1?C的向量,這樣每個(gè)通道讓一個(gè)數(shù)值表示。
注釋:對(duì)UUU實(shí)現(xiàn)全局低維嵌入,相當(dāng)于一個(gè)數(shù)值擁有該通道的全局感受野。
公式:
此外:論文中給出了使用平均池化與最大池化的實(shí)驗(yàn)對(duì)比。
第三步、
Excitation(Fex)(F{_e}{_x})(Fe?x?):這一步通過(guò)兩層全連接層完成,通過(guò)權(quán)重W生成我們我所要的權(quán)重信息,其中W是通過(guò)學(xué)習(xí)得到的,用來(lái)顯示的建模我們我需要的特征相關(guān)性。
通過(guò)兩個(gè)全連接層W1W{_1}W1? ,W2W{_2}W2?對(duì)上一步得到的向量zzz進(jìn)行處理,得到我們想要的通道權(quán)重值sss,經(jīng)過(guò)兩層全連接層后,s中不同的數(shù)值表示不同通道的權(quán)重信息,賦予通道不同的權(quán)重。
注意:兩層全連接層之間存在一個(gè)超參數(shù)RRR, 向量zzz (1?1?C)(1*1*C)(1?1?C)經(jīng)過(guò)第一層全連接層后維度由
(1?1?C)(1*1*C)(1?1?C)變?yōu)?span id="ozvdkddzhkzd" class="katex--inline">(1?1?C/R)(1*1*C/R)(1?1?C/R),再經(jīng)過(guò)第二層全連接層為度由(1?1?C/R)(1*1*C/R)(1?1?C/R)變?yōu)?span id="ozvdkddzhkzd" class="katex--inline">(1?1?C)(1*1*C)(1?1?C)。第一層全連接層的激活函數(shù)為ReLU,第二層全連接層的激活函數(shù)為Sigmoid。
第四步、
Scale(Fscale)(F{_{scale}})(Fscale?):由算法流程圖可以看出,第四步的操作是將第三步生成權(quán)重向量sss對(duì)特征圖UUU進(jìn)行權(quán)重賦值,得到我們想要的特征圖X~\tilde XX~,其尺寸大小與特征圖UUU完全一樣,SE模塊不改變特征圖的小大。
通過(guò)生成的特征向量sss(1?1?C1*1*C1?1?C)與特征圖UUU(H?W?CH*W*CH?W?C),對(duì)應(yīng)通道相乘,即特征圖UUU中每個(gè)通道的H?WH*WH?W個(gè)數(shù)值都乘sss中對(duì)應(yīng)通道的權(quán)值。
SE模塊的結(jié)構(gòu)圖
SE模塊是一個(gè)即插即用的模塊,在上圖中左邊是在一個(gè)卷積模塊之后直接插入SE模塊,右邊是在ResNet結(jié)構(gòu)中添加了SE模塊。
實(shí)現(xiàn)代碼
import torch.nn as nnclass SEModel(nn.Module):def __init__(self, channel, reduction=16):super(SEModel, self).__init__()self.avg_pool = nn.AdaptiveAvgPool2d(1)self.fc = nn.Sequential(nn.Linear(channel, channel // reduction, bias=False),nn.ReLU(),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)網(wǎng)上有較多的公開(kāi)代碼,都可以進(jìn)行參考。
最后
SE模塊在使用時(shí)如何選擇添加的位置是值得考慮的問(wèn)題,如何實(shí)現(xiàn)最大化的提升。
MobileNetV3中使用了SE模塊,通過(guò)神經(jīng)網(wǎng)絡(luò)架構(gòu)搜索進(jìn)行了最優(yōu)位置選擇,值得思考與學(xué)習(xí)。
如有錯(cuò)誤,望大家指正。B站上有很多大佬的講解視頻,喜歡視頻講解的可以看一下。
總結(jié)
- 上一篇: vue样式中背景图片路径_vue打包cs
- 下一篇: edius隐藏快捷键_超级实用的ediu