CBAM: Convolutional Block Attention Module—— channel attention + spatial attention

2023-11-15

  1. 影响卷积神经网络的几大因素:
  • Depth: VGG, ResNet
  • Width: GoogLeNet
  • Cardinality: Xception, ResNeXt
  • Attention:channel attention, spatial attention
  1. Attention在人类感知系统中扮演了重要角色,人类视觉系统的一大重要性质是人类并不是试图一次处理完整个场景,与此相反,为了更好地捕捉视觉结构,人类利用一系列的局部瞥见,选择性地聚焦于突出的部分。

CBAM其实就是顺序进行channel attention和spatial attention:

  • Channel attention: focus on what feature map is meaningful; 全连接层是使用卷积核=1的卷积实现的
  • Spatial attention:focus on where is an informative part;沿channel 轴的求均值操作

Attention和fature map是元素级别的相乘,相乘时会自动进行broadcast(copy)操作,即channel attention沿着spatial维度广播,spatial attention沿着channel维度广播

class ChannelAttention(nn.Module):
    def __init__(self, in_planes, ratio=16):
        super(ChannelAttention, self).__init__()
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.max_pool = nn.AdaptiveMaxPool2d(1)

        self.fc1   = nn.Conv2d(in_planes, in_planes // 16, 1, bias=False)
        self.relu1 = nn.ReLU()
        self.fc2   = nn.Conv2d(in_planes // 16, in_planes, 1, bias=False)

        self.sigmoid = nn.Sigmoid()

    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
        return self.sigmoid(out)

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'
        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)
        x = torch.cat([avg_out, max_out], dim=1)
        x = self.conv1(x)
        return self.sigmoid(x)

 

参考代码:https://github.com/luuuyi/CBAM.PyTorch/blob/master/model/resnet_cbam.py

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CBAM: Convolutional Block Attention Module—— channel attention + spatial attention 的相关文章

  • 五大学科竞赛(二)NIOP全国青少年信息学奥林匹克分区联赛竞赛大纲

    一 初赛内容与要求 表示普及组不涉及 以下同 计 基 算 本 机 常 的 识 诞生与发展 特点 在现代社会中的应用 计算机系统的基本组成 计算机的工作原理 计算机中的数的表示 计算机信息安全基础知识 计算机网络 计 基 算 本 机 操 的
  • IDEA使用JDBC连接MySQL数据库详细教程

    文章目录 创建项目 导入驱动 让导入的驱动生效 注册数据库驱动 连接数据库 创建项目 首先需要保证你已经成功安装mysql和下载连接MySQL数据库的驱动 在IDEA里面创建一个java项目 选择创建Java项目 JDK这里选择1 8 直接
  • 二进制文件与文本文件详解

    二进制文件 定义 二进制文件就是把内存中的数据按其在内存中存储的形式原样输出到磁盘中存放 即存放的是数据的原形式 二进制文件是包含在 ASCII 及扩展 ASCII 字符中编写的数据或程序指令的文件 一般是可执行程序 图形 声音等文件 有自
  • LeetCode 4 - 寻找两个正序数组的中位数

    二分 递归 如果某个有序数组长度是奇数 那么其中位数就是中间元素 如果长度是偶数 那么中位数就是中间两个数字的平均值 假设两个有序数组的长度分别为 m 和 n 由于两个数组长度之和 m n 的奇偶不确定 为了简化代码 在合并后的数组找到第
  • Android 环信的简单使用

    最近在项目中用到了即使用讯 客户要求用环信 我擦 第一次做 坑啊 网上对这个没有特别明确的使用教程 环信的官网也不像其他的第三方有明确的使用方法 只是说了一个简单的集成 看其他人的博客感觉都说的很麻烦 很含糊 所以现在项目完成了 做个简单的

随机推荐

  • MySQL数据库更换数据路径

    1 路径 原路径 datadir var lib mysql socket var lib mysql mysql sock log error var log mysqld log 更换后目标路径 datadir home mysql s
  • win10 python永久换源-- 解决VSCode配置ESP IDF到最后python virtual environment 错误 问题

    运行shell 找到 python 的 Scripts 文件夹下 例如 cd F ESP VSC ESP32 ENV python env idf4 4 py3 8 env Scripts 执行它 pip config set global
  • HTML静态网页设计基础

    如何新建一个HTML文件 答 1 新建一个TXT文件 2 打开TXT文件后 输入网页基本结构 另存为 可得到 回答over 下一步 html静态网页的基本结构 以及插入图片 插入超链接 分段 换行 标题号 表格标签 标题号 h2 第二分网页
  • java和bootstrap实现行内编辑

    实现BootstrapTable单个单元格编辑后立马提交保存 批量编辑已经选中的单元格后提交保存的实现 排序有点乱了 随便记一下吧 大概就是引入这三个文件 首先引入x editable相关的js css文件
  • unity Shader实现半透明阴影

    在shader中 要对移动端的兼容 还不想实现两套分开兼容的话 pragma exclude renderers gles gles3 glcore pragma target 4 5 这两句话一定要改掉 第一行代码直接剔除了gles的渲染
  • CStdioFile扩展(支持Ansi、Unicode、Utf-8等文本格式)

    头文件声明 CStdioFileEx h StdioFileEx h interface for the CStdioFileEx class Version 1 1 23 August 2003 Incorporated fixes fr
  • 防抖和节流怎么做

    防抖和节流都是为了控制代码执行频率 提高性能和用户体验 防抖和节流的区别在于 防抖是在一定时间内只执行最后一次操作 而节流是在一定时间内只执行一次操作 下面是防抖和节流的代码实现 防抖 function debounce fn delay
  • AdapterViewFlipper和StackView的使用

    练习使用AdapterViewFlipper 1 xml布局文件
  • 20230903-闹钟

    app cpp include app h include ui app h int k1 true APP APP QWidget parent QWidget parent ui new Ui APP ui gt setupUi thi
  • IDEA编译器中关闭包显示并排的问题

    问题 IDEA编译器默认是包并排显示 不好操作 解决 取消Compact Middle Packages打勾就可以了
  • CMOS图像传感器——TOF 图像传感器

    一 3D成像技术概述 图像传感器一直以来都是人类研究的热点 但随着当代科学技术发展 人类对于传统的 2D 图像传感器的要求越来高 不仅期望着更高分辨率 更快速度 更大的动态范围 人类加希望能够获得物体深信息 但是 2D 成 像技术现在已经不
  • 接口测试与功能测试的区别~

    今天为大家分享的是我们在日常测试工作中 一定会接触并且目前在企业中是主要测试内容的 功能测试与接口测试 一 功能测试与接口测试的基本概念 1 1 什么是功能测试呢 功能测试 是黑盒测试的一方面 检查实际软件的功能是否符合用户的需求 功能测试
  • 【Java面试题汇总】Java基础篇——基础、修饰符和关键字(2023版)

    导航 黑马Java笔记 踩坑汇总 JavaSE JavaWeb SSM SpringBoot 瑞吉外卖 SpringCloud 黑马旅游 谷粒商城 学成在线 设计模式 牛客面试题 目录 一 基础 1 1 请你说说Java的特点和优点 为什么
  • 方法的重写和重载

    1 重载是在本类中的 就是同一个方法名而内容不一样的方法 也就是同名 同类型的方法 返回类型可以不考虑 允许存在多个同名方法 public void show int int 这个方法名 public void show int int i
  • 裁剪图片vue-cropper实例 基础功能 预览 获取裁剪后图片数据

    在项目中使用到了裁剪图片功能 通过vue croppe实现 安装和引入 npm 安装 npm install vue cropper yarn 安装 yarn add vue cropper 项目中引用引入 这里我的项目是 vue2 组件中
  • 神奇的向量旋转

    在计算几何中最常用的就是向量 叉积 今天来一起研究一下向量的旋转 首先考虑一个向量 p x y 那么它写成坐标的形式就是x iy 这个就是P点在复平面的坐标 问题 假设现在有一个角度d 并且使向量p沿逆时针方向旋转d角度并且不改变其模的大小
  • openLayers画椭圆

    前言 OpenLayers可以通过代码绘制多种几何形状 也可以通过draw类型的交互组件绘制几何形状 官方实例提供了类如圆 折线 矩形 星形等方法 除此之外 椭圆这种图形其实也是非常常见的几何图形 但是官方没有提供现成的API 本文从使用代
  • linux新建文件夹_Linux下配置NAS的一些总结经验

    前言 经历了上一次的Windows Server的痛苦配置以后 我决定换成Linux来配置NAS 相对于Windows平台 Linux平台会更加自由和简洁 而且清晰的权限和后台也要比Win更加干净 唯一的弊端就是要去学不少命令 但是我这里会
  • http通过get方法调用接口代码部分

    请求参数的java类 import java sql Timestamp public class ReqData private String appKey private String sign private String versi
  • CBAM: Convolutional Block Attention Module—— channel attention + spatial attention

    影响卷积神经网络的几大因素 Depth VGG ResNet Width GoogLeNet Cardinality Xception ResNeXt Attention channel attention spatial attentio