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()) # 打印輸入和輸出的