CBAM(Convolutional Block Attention Module)是一種用于增強(qiáng)卷積神經(jīng)網(wǎng)絡(luò)(CNN)性能的注意力機(jī)制模塊。它由Sanghyun Woo等人在2018年的論文[1807.06521] CBAM: Convolutional Block Attention Module (arxiv.org)中提出。CBAM的主要目標(biāo)是通過在CNN中引入通道注意力和空間注意力來提高模型的感知能力,從而在不增加網(wǎng)絡(luò)復(fù)雜性的情況下改善性能。
1、概述
CBAM旨在克服傳統(tǒng)卷積神經(jīng)網(wǎng)絡(luò)在處理不同尺度、形狀和方向信息時的局限性。為此,CBAM引入了兩種注意力機(jī)制:通道注意力和空間注意力。通道注意力有助于增強(qiáng)不同通道的特征表示,而空間注意力有助于提取空間中不同位置的關(guān)鍵信息。
2、模型結(jié)構(gòu)
CBAM由兩個關(guān)鍵部分組成:通道注意力模塊(C-channel)和空間注意力模塊(S-channel)。這兩個模塊可以分別嵌入到CNN中的不同層,以增強(qiáng)特征表示。
2.1 通道注意力模塊
通道注意力模塊的目標(biāo)是增強(qiáng)每個通道的特征表達(dá)。以下是實現(xiàn)通道注意力模塊的步驟:
-
全局最大池化和全局平均池化: 對于輸入特征圖,首先對每個通道執(zhí)行全局最大池化和全局平均池化操作,計算每個通道上的最大特征值和平均特征值。這會生成兩個包含通道數(shù)的向量,分別表示每個通道的全局最大特征和平均特征。
-
全連接層: 將全局最大池化和平均池化后的特征向量輸入到一個共享全連接層中。這個全連接層用于學(xué)習(xí)每個通道的注意力權(quán)重。通過學(xué)習(xí),網(wǎng)絡(luò)可以自適應(yīng)地決定哪些通道對于當(dāng)前任務(wù)更加重要。將全局最大特征向量和平均特征向相交,得到最終注意力權(quán)重向量。
-
Sigmoid激活: 為了確保注意力權(quán)重位于0到1之間,應(yīng)用Sigmoid激活函數(shù)來產(chǎn)生通道注意力權(quán)重。這些權(quán)重將應(yīng)用于原始特征圖的每個通道。
-
注意力加權(quán): 使用得到的注意力權(quán)重,將它們與原始特征圖的每個通道相乘,得到注意力加權(quán)后的通道特征圖。這將強(qiáng)調(diào)對當(dāng)前任務(wù)有幫助的通道,并抑制無關(guān)的通道。
代碼實現(xiàn):文章來源:http://www.zghlxwxcb.cn/news/detail-639063.html
class ChannelAttention(nn.Module):
"""
CBAM混合注意力機(jī)制的通道注意力
"""
def __init__(self, in_channels, ratio=16):
super(ChannelAttention, self).__init__()
self.avg_pool = nn.AdaptiveAvgPool2d(1)
self.max_pool = nn.AdaptiveMaxPool2d(1)
self.fc = nn.Sequential(
# 全連接層
# nn.Linear(in_planes, in_planes // ratio, bias=False),
# nn.ReLU(),
# nn.Linear(in_planes // ratio, in_planes, bias=False)
# 利用1x1卷積代替全連接,避免輸入必須尺度固定的問題,并減小計算量
nn.Conv2d(in_channels, in_channels // ratio, 1, bias=False),
nn.ReLU(inplace=True),
nn.Conv2d(in_channels // ratio, in_channels, 1, bias=False)
)
self.sigmoid = nn.Sigmoid()
def forward(self, x):
avg_out = self.fc(self.avg_pool(x))
max_out = self.fc(self.max_pool(x))
out = avg_out + max_out
out = self.sigmoid(out)
return out * x
?
2.2 空間注意力模塊
空間注意力模塊的目標(biāo)是強(qiáng)調(diào)圖像中不同位置的重要性。以下是實現(xiàn)空間注意力模塊的步驟:
- 最大池化和平均池化: 對于輸入特征圖,分別沿通道維度執(zhí)行最大池化和平均池化操作,生成不同上下文尺度的特征。
- 連接和卷積: 將最大池化和平均池化后的特征沿著通道維度進(jìn)行連接(拼接),得到一個具有不同尺度上下文信息的特征圖。然后,通過卷積層處理這個特征圖,以生成空間注意力權(quán)重。
- Sigmoid激活: 類似于通道注意力模塊,對生成的空間注意力權(quán)重應(yīng)用Sigmoid激活函數(shù),將權(quán)重限制在0到1之間。
- 注意力加權(quán): 將得到的空間注意力權(quán)重應(yīng)用于原始特征圖,對每個空間位置的特征進(jìn)行加權(quán)。這樣可以突出重要的圖像區(qū)域,并減少不重要的區(qū)域的影響。
代碼實現(xiàn):
class SpatialAttention(nn.Module):
"""
CBAM混合注意力機(jī)制的空間注意力
"""
def __init__(self, kernel_size=7):
super(SpatialAttention, self).__init__()
assert kernel_size in (3, 7), 'kernel size must be 3 or 7'
padding = 3 if kernel_size == 7 else 1
self.conv1 = nn.Conv2d(2, 1, kernel_size, padding=padding, bias=False)
self.sigmoid = nn.Sigmoid()
def forward(self, x):
avg_out = torch.mean(x, dim=1, keepdim=True)
max_out, _ = torch.max(x, dim=1, keepdim=True)
out = torch.cat([avg_out, max_out], dim=1)
out = self.sigmoid(self.conv1(out))
return out * x
2.3 混合注意力模塊
CBAM就是將通道注意力模塊和空間注意力模塊的輸出特征逐元素相乘,得到最終的注意力增強(qiáng)特征。這個增強(qiáng)的特征將用作后續(xù)網(wǎng)絡(luò)層的輸入,以在保留關(guān)鍵信息的同時,抑制噪聲和無關(guān)信息。原文實驗證明先進(jìn)行通道維度的整合,再進(jìn)行空間維度的整合,模型效果更好(有效玄學(xué)煉丹的感覺)。
代碼實現(xiàn):
class CBAM(nn.Module):
"""
CBAM混合注意力機(jī)制
"""
def __init__(self, in_channels, ratio=16, kernel_size=3):
super(CBAM, self).__init__()
self.channelattention = ChannelAttention(in_channels, ratio=ratio)
self.spatialattention = SpatialAttention(kernel_size=kernel_size)
def forward(self, x):
x = self.channelattention(x)
x = self.spatialattention(x)
return x
總結(jié)
總之,CBAM模塊通過自適應(yīng)地學(xué)習(xí)通道和空間注意力權(quán)重,以提高卷積神經(jīng)網(wǎng)絡(luò)的特征表達(dá)能力。通過將通道注意力和空間注意力結(jié)合起來,CBAM模塊能夠在不同維度上捕獲特征之間的相關(guān)性,從而提升圖像識別任務(wù)的性能。文章來源地址http://www.zghlxwxcb.cn/news/detail-639063.html
到了這里,關(guān)于【深度學(xué)習(xí)注意力機(jī)制系列】—— CBAM注意力機(jī)制(附pytorch實現(xiàn))的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!