基于CBAM-CNN卷积神经网络预测研究(Python代码实现)

简介: 基于CBAM-CNN卷积神经网络预测研究(Python代码实现)

💥1 概述

CBAM(CBAM-CNN)是一种用于计算机视觉领域的卷积神经网络结构,它能够有效地从图像中学习关注和调整。CBAM模型结合了通道注意力模块(Channel Attention Module)和空间注意力模块(Spatial Attention Module)两个部分,用于提升卷积神经网络的性能。


通道注意力模块(CAM)旨在通过学习不同通道之间的相关性,为每个通道分配适当的注意力权重。该模块首先通过全局平均池化获得整个通道的平均值,然后使用两个全连接层来生成一组注意力权重。这些权重用于调整每个通道的特征图。


空间注意力模块(SAM)旨在学习图像中不同空间区域的重要性。该模块通过对特征图在不同空间维度上进行最大池化和平均池化操作,然后使用一个卷积层来生成一组注意力权重。最后,这些权重被应用于原始特征图,以增强具有重要空间信息的区域。


通过结合通道注意力模块和空间注意力模块,CBAM能够动态地选择和调整特征图的通道和空间注意力,从而提取更准确和具有区分力的特征表示。这种注意力机制有助于网络更好地对图像进行感知,从而改善图像分类、目标检测、图像分割等计算机视觉任务的性能。


针对预测任务,可以使用CBAM-CNN模型进行图像分类或目标检测。在图像分类任务中,CBAM-CNN可以通过自适应地关注重要的通道和空间区域,提取图像特征并进行分类。在目标检测任务中,CBAM-CNN可以辅助检测网络对目标区域进行准确定位和分类。


需要注意的是,CBAM-CNN只是一种网络结构,具体的预测研究还需要根据具体的任务和数据集进行调整和优化。


📚2 运行结果


部分代码:

def forward(self, x):
        # 1.最大池化分支
        max_branch = self.MaxPool(x)
        # 送入MLP全连接神经网络, 得到权重
        max_in = max_branch.view(max_branch.size(0), -1)
        max_weight = self.fc_MaxPool(max_in)
        # 2.全局池化分支
        avg_branch = self.AvgPool(x)
        # 送入MLP全连接神经网络, 得到权重
        avg_in = avg_branch.view(avg_branch.size(0), -1)
        avg_weight = self.fc_AvgPool(avg_in)
        # MaxPool + AvgPool 激活后得到权重weight
        weight = max_weight + avg_weight
        weight = self.sigmoid(weight)
        # 将维度为b, c的weight, reshape成b, c, 1, 1 与 输入x 相乘
        h, w = weight.shape
        # 通道注意力Mc
        Mc = torch.reshape(weight, (h, w, 1))
        # 乘积获得结果
        x = Mc * x
        return x
class 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, 结果为[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)  # 获得特征图
        # 卷积操作得到空间注意力结果
        x_out = self.conv(x_cat)
        Ms = self.sigmoid(x_out)
        # 与原图通道进行乘积
        x = Ms * x
        return x
if __name__ == '__main__':
    inputs = torch.randn(32, 512, 16)
    model = CBAM(in_channel=512)  # CBAM模块, 可以插入CNN及任意网络中, 输入特征图in_channel的维度


    def forward(self, x):
        # 1.最大池化分支
        max_branch = self.MaxPool(x)
        # 送入MLP全连接神经网络, 得到权重
        max_in = max_branch.view(max_branch.size(0), -1)
        max_weight = self.fc_MaxPool(max_in)
        # 2.全局池化分支
        avg_branch = self.AvgPool(x)
        # 送入MLP全连接神经网络, 得到权重
        avg_in = avg_branch.view(avg_branch.size(0), -1)
        avg_weight = self.fc_AvgPool(avg_in)
        # MaxPool + AvgPool 激活后得到权重weight
        weight = max_weight + avg_weight
        weight = self.sigmoid(weight)
        # 将维度为b, c的weight, reshape成b, c, 1, 1 与 输入x 相乘
        h, w = weight.shape
        # 通道注意力Mc
        Mc = torch.reshape(weight, (h, w, 1))
        # 乘积获得结果
        x = Mc * x
        return x
class 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, 结果为[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)  # 获得特征图
        # 卷积操作得到空间注意力结果
        x_out = self.conv(x_cat)
        Ms = self.sigmoid(x_out)
        # 与原图通道进行乘积
        x = Ms * x
        return x
if __name__ == '__main__':
    inputs = torch.randn(32, 512, 16)
    model = CBAM(in_channel=512)  # CBAM模块, 可以插入CNN及任意网络中, 输入特征图in_channel的维度

🎉3 参考文献

部分理论来源于网络,如有侵权请联系删除。

[1]黄昌顺,张金萍.基于CBAM-CNN的滚动轴承故障诊断方法[J].现代制造工程,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.


🌈4 Python代码及数据

相关实践学习
函数计算部署PuLID for FLUX人像写真实现智能换颜效果
只需一张图片,生成程序员专属写真!本次实验在函数计算中内置PuLID for FLUX,您可以通过函数计算+Serverless应用中心一键部署Flux模型,快速体验超写实图像生成的魅力。
从 0 入门函数计算
在函数计算的架构中,开发者只需要编写业务代码,并监控业务运行情况就可以了。这将开发者从繁重的运维工作中解放出来,将精力投入到更有意义的开发任务上。
相关文章
|
6月前
|
测试技术 Python
Python装饰器:为你的代码施展“魔法”
Python装饰器:为你的代码施展“魔法”
359 100
|
6月前
|
开发者 Python
Python列表推导式:一行代码的艺术与力量
Python列表推导式:一行代码的艺术与力量
537 95
|
7月前
|
Python
Python的简洁之道:5个让代码更优雅的技巧
Python的简洁之道:5个让代码更优雅的技巧
361 104
|
7月前
|
开发者 Python
Python神技:用列表推导式让你的代码更优雅
Python神技:用列表推导式让你的代码更优雅
633 99
|
6月前
|
缓存 Python
Python装饰器:为你的代码施展“魔法
Python装饰器:为你的代码施展“魔法
344 88
|
6月前
|
监控 机器人 编译器
如何将python代码打包成exe文件---PyInstaller打包之神
PyInstaller可将Python程序打包为独立可执行文件,无需用户安装Python环境。它自动分析代码依赖,整合解释器、库及资源,支持一键生成exe,方便分发。使用pip安装后,通过简单命令即可完成打包,适合各类项目部署。
1221 68
|
6月前
|
数据可视化 大数据 关系型数据库
基于python大数据技术的医疗数据分析与研究
在数字化时代,医疗数据呈爆炸式增长,涵盖患者信息、检查指标、生活方式等。大数据技术助力疾病预测、资源优化与智慧医疗发展,结合Python、MySQL与B/S架构,推动医疗系统高效实现。
|
7月前
|
机器学习/深度学习 传感器 数据采集
基于贝叶斯优化CNN-LSTM混合神经网络预测(Matlab代码实现)
基于贝叶斯优化CNN-LSTM混合神经网络预测(Matlab代码实现)
1176 0
|
7月前
|
机器学习/深度学习 传感器 数据采集
【故障识别】基于CNN-SVM卷积神经网络结合支持向量机的数据分类预测研究(Matlab代码实现)
【故障识别】基于CNN-SVM卷积神经网络结合支持向量机的数据分类预测研究(Matlab代码实现)
475 0
|
9月前
|
机器学习/深度学习 人工智能 PyTorch
零基础入门CNN:聚AI卷积神经网络核心原理与工业级实战指南
卷积神经网络(CNN)通过局部感知和权值共享两大特性,成为计算机视觉的核心技术。本文详解CNN的卷积操作、架构设计、超参数调优及感受野计算,结合代码示例展示其在图像分类、目标检测等领域的应用价值。
519 7

推荐镜像

更多