境外公司注冊優(yōu)化工具箱下載
?💥💥💞💞歡迎來到本博客????💥💥
🏆博主優(yōu)勢:🌞🌞🌞博客內(nèi)容盡量做到思維縝密,邏輯清晰,為了方便讀者。
??座右銘:行百里者,半于九十。
📋📋📋本文目錄如下:🎁🎁🎁
目錄
💥1 概述
📚2 運行結(jié)果
🎉3?參考文獻
🌈4 Python代碼及數(shù)據(jù)
💥1 概述
CBAM(CBAM-CNN)是一種用于計算機視覺領域的卷積神經(jīng)網(wǎng)絡結(jié)構(gòu),它能夠有效地從圖像中學習關注和調(diào)整。CBAM模型結(jié)合了通道注意力模塊(Channel Attention Module)和空間注意力模塊(Spatial Attention Module)兩個部分,用于提升卷積神經(jīng)網(wǎng)絡的性能。
通道注意力模塊(CAM)旨在通過學習不同通道之間的相關性,為每個通道分配適當?shù)淖⒁饬?quán)重。該模塊首先通過全局平均池化獲得整個通道的平均值,然后使用兩個全連接層來生成一組注意力權(quán)重。這些權(quán)重用于調(diào)整每個通道的特征圖。
空間注意力模塊(SAM)旨在學習圖像中不同空間區(qū)域的重要性。該模塊通過對特征圖在不同空間維度上進行最大池化和平均池化操作,然后使用一個卷積層來生成一組注意力權(quán)重。最后,這些權(quán)重被應用于原始特征圖,以增強具有重要空間信息的區(qū)域。
通過結(jié)合通道注意力模塊和空間注意力模塊,CBAM能夠動態(tài)地選擇和調(diào)整特征圖的通道和空間注意力,從而提取更準確和具有區(qū)分力的特征表示。這種注意力機制有助于網(wǎng)絡更好地對圖像進行感知,從而改善圖像分類、目標檢測、圖像分割等計算機視覺任務的性能。
針對預測任務,可以使用CBAM-CNN模型進行圖像分類或目標檢測。在圖像分類任務中,CBAM-CNN可以通過自適應地關注重要的通道和空間區(qū)域,提取圖像特征并進行分類。在目標檢測任務中,CBAM-CNN可以輔助檢測網(wǎng)絡對目標區(qū)域進行準確定位和分類。
需要注意的是,CBAM-CNN只是一種網(wǎng)絡結(jié)構(gòu),具體的預測研究還需要根據(jù)具體的任務和數(shù)據(jù)集進行調(diào)整和優(yōu)化。
📚2 運行結(jié)果
?部分代碼:
def forward(self, x):# 1.最大池化分支max_branch = self.MaxPool(x)# 送入MLP全連接神經(jīng)網(wǎng)絡, 得到權(quán)重max_in = max_branch.view(max_branch.size(0), -1)max_weight = self.fc_MaxPool(max_in)# 2.全局池化分支avg_branch = self.AvgPool(x)# 送入MLP全連接神經(jīng)網(wǎng)絡, 得到權(quán)重avg_in = avg_branch.view(avg_branch.size(0), -1)avg_weight = self.fc_AvgPool(avg_in)# MaxPool + AvgPool 激活后得到權(quán)重weightweight = max_weight + avg_weightweight = self.sigmoid(weight)# 將維度為b, c的weight, reshape成b, c, 1, 1 與 輸入x 相乘h, w = weight.shape# 通道注意力McMc = torch.reshape(weight, (h, w, 1))# 乘積獲得結(jié)果x = Mc * xreturn xclass SpatialAttentionModul(nn.Module): # 空間注意力模塊def __init__(self, in_channel):super(SpatialAttentionModul, self).__init__()self.conv = nn.Conv1d(2, 1, 7, padding=3)self.sigmoid = nn.Sigmoid()def forward(self, x):# x維度為 [N, C, H, W] 沿著維度C進行操作, 所以dim=1, 結(jié)果為[N, H, W]MaxPool = torch.max(x, dim=1).values # torch.max 返回的是索引和value, 要用.values去訪問值才行!AvgPool = torch.mean(x, dim=1)# 增加維度, 變成 [N, 1, H, W]MaxPool = torch.unsqueeze(MaxPool, dim=1)AvgPool = torch.unsqueeze(AvgPool, dim=1)# 維度拼接 [N, 2, H, W]x_cat = torch.cat((MaxPool, AvgPool), dim=1) # 獲得特征圖# 卷積操作得到空間注意力結(jié)果x_out = self.conv(x_cat)Ms = self.sigmoid(x_out)# 與原圖通道進行乘積x = Ms * xreturn xif __name__ == '__main__':inputs = torch.randn(32, 512, 16)model = CBAM(in_channel=512) # CBAM模塊, 可以插入CNN及任意網(wǎng)絡中, 輸入特征圖in_channel的維度
def forward(self, x):# 1.最大池化分支max_branch = self.MaxPool(x)# 送入MLP全連接神經(jīng)網(wǎng)絡, 得到權(quán)重max_in = max_branch.view(max_branch.size(0), -1)max_weight = self.fc_MaxPool(max_in)# 2.全局池化分支avg_branch = self.AvgPool(x)# 送入MLP全連接神經(jīng)網(wǎng)絡, 得到權(quán)重avg_in = avg_branch.view(avg_branch.size(0), -1)avg_weight = self.fc_AvgPool(avg_in)# MaxPool + AvgPool 激活后得到權(quán)重weightweight = max_weight + avg_weightweight = self.sigmoid(weight)# 將維度為b, c的weight, reshape成b, c, 1, 1 與 輸入x 相乘h, w = weight.shape# 通道注意力McMc = torch.reshape(weight, (h, w, 1))# 乘積獲得結(jié)果x = Mc * xreturn xclass SpatialAttentionModul(nn.Module): # 空間注意力模塊def __init__(self, in_channel):super(SpatialAttentionModul, self).__init__()self.conv = nn.Conv1d(2, 1, 7, padding=3)self.sigmoid = nn.Sigmoid()def forward(self, x):# x維度為 [N, C, H, W] 沿著維度C進行操作, 所以dim=1, 結(jié)果為[N, H, W]MaxPool = torch.max(x, dim=1).values # torch.max 返回的是索引和value, 要用.values去訪問值才行!AvgPool = torch.mean(x, dim=1)# 增加維度, 變成 [N, 1, H, W]MaxPool = torch.unsqueeze(MaxPool, dim=1)AvgPool = torch.unsqueeze(AvgPool, dim=1)# 維度拼接 [N, 2, H, W]x_cat = torch.cat((MaxPool, AvgPool), dim=1) # 獲得特征圖# 卷積操作得到空間注意力結(jié)果x_out = self.conv(x_cat)Ms = self.sigmoid(x_out)# 與原圖通道進行乘積x = Ms * xreturn xif __name__ == '__main__':inputs = torch.randn(32, 512, 16)model = CBAM(in_channel=512) # CBAM模塊, 可以插入CNN及任意網(wǎng)絡中, 輸入特征圖in_channel的維度
🎉3?參考文獻
部分理論來源于網(wǎng)絡,如有侵權(quán)請聯(lián)系刪除。
[1]黃昌順,張金萍.基于CBAM-CNN的滾動軸承故障診斷方法[J].現(xiàn)代制造工程,2022(11):137-143.DOI:10.16731/j.cnki.1671-3133.2022.11.022.
[2]杜先君,鞏彬,余萍等.基于CBAM-CNN的模擬電路故障診斷[J].控制與決策,2022,37(10):2609-2618.DOI:10.13195/j.kzyjc.2021.1111.