深度學習模塊3-CBAM模塊

2爬范、CBAM模塊

論文《CBAM: Convolutional Block Attention Module》

1财著、作用

是為了提升前饋卷積神經(jīng)網(wǎng)絡(luò)性能而提出的一種簡單而有效的注意力模塊侧巨。CBAM通過順序地推斷兩個維度上的注意力圖(通道和空間)纱新,然后將這些注意力圖乘以輸入特征圖進行自適應(yīng)特征精煉奢驯。

2适掰、機制

1估蹄、通道注意力模塊(Channel Attention Module)
通過利用特征之間的通道關(guān)系來生成通道注意力圖预厌。每個通道的特征圖被視為一個特征探測器,通道注意力關(guān)注于給定輸入圖像中“什么”是有意義的元媚。為了有效地計算通道注意力轧叽,CBAM首先對輸入特征圖的空間維度進行壓縮,同時使用平均池化和最大池化操作來捕獲不同的空間上下文描述符刊棕,這些被送入共享的多層感知機(MLP)以產(chǎn)生通道注意力圖炭晒。
2、空間注意力模塊(Spatial Attention Module)
利用特征之間的空間關(guān)系來生成空間注意力圖甥角。與通道注意力不同网严,空間注意力關(guān)注于“在哪里”是一個有信息的部分,這與通道注意力是互補的嗤无。為了計算空間注意力震束,CBAM首先沿著通道軸應(yīng)用平均池化和最大池化操作怜庸,然后將它們連接起來生成一個高效的特征描述符。在該描述符上應(yīng)用一個卷積層來生成空間注意力圖垢村。

3割疾、獨特優(yōu)勢

1、雙重注意力機制
CBAM首次將通道注意力(Channel Attention)和空間注意力(Spatial Attention)順序結(jié)合起來嘉栓,對輸入特征進行兩階段的精煉宏榕。這種設(shè)計讓模型先關(guān)注于“哪些通道是重要的”,然后再關(guān)注于“空間上哪些位置是重要的”侵佃,從而更加全面地捕獲特征中的關(guān)鍵信息麻昼。
2、自適應(yīng)特征重標定
通過通道注意力和空間注意力的逐步應(yīng)用馋辈,CBAM能夠自適應(yīng)地調(diào)整輸入特征圖中每個通道和空間位置的重要性抚芦。這種自適應(yīng)重標定機制允許模型根據(jù)任務(wù)需求和內(nèi)容上下文動態(tài)地關(guān)注于最有用的特征,從而提高模型的表征能力和決策準確性迈螟。
3叉抡、靈活性和通用性
CBAM模塊設(shè)計簡潔,可輕松集成到各種現(xiàn)有的CNN架構(gòu)中井联,如ResNet卜壕、Inception等您旁,而不需要對原始架構(gòu)進行大的修改烙常。這種靈活性和通用性使CBAM成為一種有效的插件,可以廣泛應(yīng)用于各種視覺識別任務(wù)鹤盒,包括圖像分類蚕脏、目標檢測和語義分割等。
4侦锯、計算效率高
盡管CBAM為模型引入了額外的計算驼鞭,但其設(shè)計考慮了計算效率,如通過全局平均池化和最大池化來簡化通道注意力的計算尺碰,通過簡單的卷積操作來實現(xiàn)空間注意力挣棕。這些設(shè)計使得CBAM能夠在帶來性能提升的同時,保持較低的額外計算成本亲桥。

5洛心、逐步精煉策略

CBAM中通道和空間注意力的順序應(yīng)用,形成了一種逐步精煉輸入特征的策略题篷。這種從通道到空間的逐步細化過程词身,有助于模型更有效地利用注意力機制,逐漸提取并強調(diào)更加有意義的特征番枚,而不是一次性地處理所有信息法严。

4损敷、代碼

import torch
from torch import nn

# 通道注意力模塊
class ChannelAttention(nn.Module):
    def __init__(self, in_planes, ratio=16):
        super(ChannelAttention, self).__init__()
        self.avg_pool = nn.AdaptiveAvgPool2d(1)  # 自適應(yīng)平均池化
        self.max_pool = nn.AdaptiveMaxPool2d(1)  # 自適應(yīng)最大池化

        # 兩個卷積層用于從池化后的特征中學習注意力權(quán)重
        self.fc1 = nn.Conv2d(in_planes, in_planes // ratio, 1, bias=False)  # 第一個卷積層,降維
        self.relu1 = nn.ReLU()  # ReLU激活函數(shù)
        self.fc2 = nn.Conv2d(in_planes // ratio, in_planes, 1, bias=False)  # 第二個卷積層深啤,升維
        self.sigmoid = nn.Sigmoid()  # Sigmoid函數(shù)生成最終的注意力權(quán)重

    def forward(self, x):
        avg_out = self.fc2(self.relu1(self.fc1(self.avg_pool(x))))  # 對平均池化的特征進行處理
        max_out = self.fc2(self.relu1(self.fc1(self.max_pool(x))))  # 對最大池化的特征進行處理
        out = avg_out + max_out  # 將兩種池化的特征加權(quán)和作為輸出
        return self.sigmoid(out)  # 使用sigmoid激活函數(shù)計算注意力權(quán)重

# 空間注意力模塊
class SpatialAttention(nn.Module):
    def __init__(self, kernel_size=7):
        super(SpatialAttention, self).__init__()

        assert kernel_size in (3, 7), 'kernel size must be 3 or 7'  # 核心大小只能是3或7
        padding = 3 if kernel_size == 7 else 1  # 根據(jù)核心大小設(shè)置填充

        # 卷積層用于從連接的平均池化和最大池化特征圖中學習空間注意力權(quán)重
        self.conv1 = nn.Conv2d(2, 1, kernel_size, padding=padding, bias=False)  
        self.sigmoid = nn.Sigmoid()  # Sigmoid函數(shù)生成最終的注意力權(quán)重

    def forward(self, x):
        avg_out = torch.mean(x, dim=1, keepdim=True)  # 對輸入特征圖執(zhí)行平均池化
        max_out, _ = torch.max(x, dim=1, keepdim=True)  # 對輸入特征圖執(zhí)行最大池化
        x = torch.cat([avg_out, max_out], dim=1)  # 將兩種池化的特征圖連接起來
        x = self.conv1(x)  # 通過卷積層處理連接后的特征圖
        return self.sigmoid(x)  # 使用sigmoid激活函數(shù)計算注意力權(quán)重

# CBAM模塊
class CBAM(nn.Module):
    def __init__(self, in_planes, ratio=16, kernel_size=7):
        super(CBAM, self).__init__()
        self.ca = ChannelAttention(in_planes, ratio)  # 通道注意力實例
        self.sa = SpatialAttention(kernel_size)  # 空間注意力實例

    def forward(self, x):
        out = x * self.ca(x)  # 使用通道注意力加權(quán)輸入特征圖
        result = out * self.sa(out)  # 使用空間注意力進一步加權(quán)特征圖
        return result  # 返回最終的特征圖

# 示例使用
if __name__ == '__main__':
    block = CBAM(64)  # 創(chuàng)建一個CBAM模塊拗馒,輸入通道為64
    input = torch.rand(1, 64, 64, 64)  # 隨機生成一個輸入特征圖
    output = block(input)  # 通過CBAM模塊處理輸入特征圖
    print(input.size(), output.size())  # 打印輸入和輸出的

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末反浓,一起剝皮案震驚了整個濱河市合敦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌手销,老刑警劉巖苫幢,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件访诱,死亡現(xiàn)場離奇詭異,居然都是意外死亡韩肝,警方通過查閱死者的電腦和手機触菜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來哀峻,“玉大人涡相,你說我怎么就攤上這事∈s埃” “怎么了催蝗?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長育特。 經(jīng)常有香客問我丙号,道長,這世上最難降的妖魔是什么缰冤? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任犬缨,我火速辦了婚禮,結(jié)果婚禮上棉浸,老公的妹妹穿的比我還像新娘怀薛。我一直安慰自己,他們只是感情好迷郑,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布枝恋。 她就那樣靜靜地躺著,像睡著了一般嗡害。 火紅的嫁衣襯著肌膚如雪焚碌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天就漾,我揣著相機與錄音呐能,去河邊找鬼。 笑死,一個胖子當著我的面吹牛摆出,可吹牛的內(nèi)容都是我干的朗徊。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼偎漫,長吁一口氣:“原來是場噩夢啊……” “哼爷恳!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起象踊,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤温亲,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后杯矩,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體栈虚,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年史隆,在試婚紗的時候發(fā)現(xiàn)自己被綠了魂务。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡泌射,死狀恐怖粘姜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情熔酷,我是刑警寧澤孤紧,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站拒秘,受9級特大地震影響号显,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜翼抠,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一咙轩、第九天 我趴在偏房一處隱蔽的房頂上張望获讳。 院中可真熱鬧阴颖,春花似錦、人聲如沸丐膝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽帅矗。三九已至偎肃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間浑此,已是汗流浹背累颂。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人紊馏。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓料饥,卻偏偏與公主長得像,于是被迫代替她去往敵國和親朱监。 傳聞我的和親對象是個殘疾皇子岸啡,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容