深度学习 卷积神经网络即插即用的小插件

2023-11-17

前言

本篇博客主要介绍卷积神经网络中的即插即用的模块。“即插即用的插件“意味着该插件能够快速复现,并且能够随时应用到神经网络中,容易植入,容易落地,真正做到“plug-and-play”。在之前的项目当中,使用yolov4已经涉及到一些模块,如channel attention、CBAM、SE等。本文除了介绍上述几种插件,还会介绍ASPP、Non-local等即插即用小模块。本篇博客主要参考:真正的即插即用!盘点11种CNN网络设计中精巧通用的“小”插件

卷积神经网络设计技巧

卷积神经网络中,深度决定了网络的表达能力,网络越深,其学习能力越强。宽度(通道数、卷积核)决定了网络在某一层学到的信息量,因为卷积层能重组通道间的信息,这一操作能让有效信息量增大。感受野决定了网络在某一层看到多大范围,一般而言,最后一层一定至少要看到最大的有意义的物体,更大的感受野通常是无害的。在达到相同感受野的情况下,多层小卷积核的性能一定比大卷积核更好,因为多层小卷积核的非线性更强,而且有利于特征共享,如KaTeX parse error: Undefined control sequence: \timies at position 2: 7\̲t̲i̲m̲i̲e̲s̲ ̲7卷积核与两个KaTeX parse error: Undefined control sequence: \timies at position 2: 5\̲t̲i̲m̲i̲e̲s̲ ̲5的卷积核感受野相同,但是非线性能力后者优于前者。

分辨率很重要,尽量不要损失分辨率,为了保住分辨率,在使用下采样之前要保证在这一层上有足够的感受野,这个感受野是相对感受野,是指这一个下采样层相对于上一个下采样层的感受野,把两个下采样之间看成一个子网络的话,这个子网络必须得有一定的感受野才能将空间信息编码到下面的网络去,而具体需要多大的相对感受野,只能实验,一般说来,靠近输入层的层空间信息冗余度最高,所以越靠近输入层相对感受野应该越小。同时在靠近输入层的层,这里可以合成一个大卷积核来降低计算量。
这种矛盾决定了下面的做法:

前面几层下采样频率高一点,中间层下采样频率降低,并使用不下采样的方法提高深度。

网络能深则深,在保持比较小宽度的时候,要想办法加深网络,变深的过程中网络慢慢变胖。

使用小卷积核(不包括1x1,因为它对于增加感受野无意义),小卷积核有利于网络走向更深,并且有更好的识别鲁棒性,尤其是在分辨率更小的特征图上,因为卷积核的尺寸是相当于特征图的分辨率来说的,大特征图上偏大的卷积核其实也并不大。

下采样在网络前几层的密度大一些,(这样能尽可能用微弱精度损失换取速度提升) 越往后下采样的密度应该更小,最终能够下采样的最大深度,以该层的感受野以及数据集中最大的有意义物体尺寸决定(自然不可能让最大有意义的物体在某一层被下采样到分辨率小于1,但是网络依然可以work,只不过最后几层可能废弃了(要相信cnn的学习能力,因为最大不了它也能学出单位卷积,也就是只有中心元素不为0的卷积核),更准确的说这是最大感受野的极限,最大感受野应该覆盖数据集中最大有意义的物体)。

第一层下采样的时候大卷积核能尽可能保住分辨率(其实相当于合成了两三层小卷积核,另外,这和插值是类似的,类比于最近邻插值,双线性插值,双三次插值,这其实和感受野理论一致,更远的插值意味着更大的感受野)。

小插件

STN

STN出自论文:Spatial Transformer Networks。其主要架构如下图所示:
在这里插入图片描述
STN的思路是卷积神经网络具有平移不变性,另外还想让它具有其他不变性,如经过仿射变换的姿态不变性,位置不变性,光照不变性等,以此提高模型的泛化性能。提到卷积神经网络的平移不变性,也有一些说法证伪,说明神经网络不具有平移不变性,因为在执行卷积核池化后,下采样会破坏网络的平移不变性,使得网络不变性能力非常弱。

STN模块,显式将空间变换植入到网络当中,进而提高网络的旋转、平移、尺度等不变性。可以理解为“对齐”操作。每一个STN模块由Localisation net,Grid generator和Sampler三部分组成。Localisation net用于学习获取空间变换的参数。Grid generator用于坐标映射。Sampler用于像素的采集,是利用双线性插值的方式进行。STN的意义是能够把原始的图像纠正成为网络想要的理想图像,并且该过程为无监督的方式进行,也就是变换参数是自发学习获取的,不需要标注信息。该模块是一个独立模块,可以在CNN的任何位置插入。

ASPP

ASPP,即带有空洞卷积空间金字塔池化模块,采用不同的尺度(rate)进行空洞卷积,主要为了提高网络的感受野以及引入多尺度的信息。ASPP主要应用在语义分割Deeplab算法中,出自论文DeepLab: Semantic Image Segmentation with Deep Convolutional Nets, Atrous Conv。其结构如下图所示:
在这里插入图片描述
在语义分割任务中,通常面临的是分辨率较大的图片,这就要求我们的网络有足够的感受野来覆盖目标物体。对于CNN网络基本是靠卷积层的堆叠加上下采样操作来获取感受野的。本文的该模块可以在不改变特征图大小的同时控制感受野,这有利于提取多尺度信息。其中rate控制着感受野的大小,r越大感受野越大。

ASPP的结构类似Google net,主要包括以下几个部分:1. 一个全局平均池化层得到image-level特征,并进行1X1卷积,并双线性插值到原始大小;2. 一个1X1卷积层,以及三个3X3的空洞卷积;3. 将5个不同尺度的特征在channel维度concat在一起,然后送入1X1的卷积进行融合输出。
在这里插入图片描述

Non-local

Non-local模块出自论文Non-local Neural Networks
在这里插入图片描述
Non-Local是一种attention机制,也是一个易于植入和集成的模块。Local主要是针对感受野(receptive field)来说的,以CNN中的卷积操作和池化操作为例,它的感受野大小就是卷积核大小,而我们常用3X3的卷积层进行堆叠,它只考虑局部区域,都是local的运算。不同的是,non-local操作感受野可以很大,可以是全局区域,而不是一个局部区域。捕获长距离依赖(long-range dependencies),即如何建立图像上两个有一定距离的像素之间的联系,是一种注意力机制。所谓注意力机制就是利用网络生成saliency map,注意力对应的是显著性区域,是需要网络重点关注的区域。

  1. 首先分别对输入的特征图进行 1X1的卷积来压缩通道数,得到 θ \theta θ ϕ \phi ϕ g g g特征。
  2. 通过reshape操作,转化三个特征的维度,然后对 θ \theta θ ϕ \phi ϕ进行矩阵乘操作,得到类似协方差矩阵, 这一步为了计算出特征中的自相关性,即得到每帧中每个像素对其他所有帧所有像素的关系。
  3. 然后对自相关特征进行 Softmax 操作,得到0~1的weights,这里就是我们需要的 Self-attention系数。
  4. 最后将 attention系数,对应乘回特征矩阵g上,与原输入 feature map X 残差相加输出即可。

SE

SE模块其实是一种通道注意力机制。由于特征压缩和full connection的存在,其捕获通道注意力特征是具有全局信息的。而SE可以自适应地调整各通道的特征响应值,对通道间的内部依赖关系进行建模。SE的主要模块结构如下所示:
在这里插入图片描述
SE模块可以自适应的调整各通道的特征响应值,对通道间的内部依赖关系进行建模,有以下几个步骤:

  • Squeeze:沿着空间维度进行特征压缩,将每个二维的特征通道变成一个数,是具有全局的感受野。
  • Excitation:将每个特征生成一个权重,用来代表该特征通道的重要程度。
  • Reweight:将Excitation输出的权重看作每个特征通道的重要性,通过相乘的方式作用于每一个通道上

CBAM

CBAM的结构如下图所示,他由两个部分组成:Channel Attention Module和Spatial Attention Module。
在这里插入图片描述

  • Channel Attention Module:输入一个 H × W × C H\times W\times C H×W×C的特征 F F F,分别送进两个空间的全局平均池化核最大池化得到两个 1 × 1 × C 1\times 1\times C 1×1×C的通道描述。再将他们分别送进一个两层的神经网络,第一层的神经元的个数为 C r \frac{C}{r} rC,激活函数为Relu,第二层神经元的个数为C。这两层神经网络是共享的。然后再将得到两个特征相加后经过一个sigmoid激活函数得到权重系数 M c M_c Mc。最后将权重系统与原来的特征相乘即可得到缩放后的新特征。
  • Spatial Attention Module:与通道注意力相似,对于 H × W × C H\times W\times C H×W×C的特征 F F F,先分别进行一个通道维度的平均池化和最大池化得到两个 H × W × 1 H\times W\times 1 H×W×1的通道描述,并将两个描述按照通道拼接在一起。然后经过 7 × 7 7\times7 7×7的卷积层,激活函数为sigmoid,得到权重 M s M_s Ms。最后将权重与特征 F F F进行相乘即可得到缩放后的新特征。

DCN v1&v2

变形卷积(Deformable Convolutional)出自v1: [Deformable Convolutional Networks]v2: [Deformable ConvNets v2: More Deformable, Better Results],可以看作是变形+卷积两个部分。和传统的固定窗口的卷积相比,变形卷积可以有效地应对集合图形,因为它的局部感受野是可学习的,面向全图的。同时还提出Deformable ROI pooling,这两个方法都是增加额外偏移量的空间采样位置,不需要额外的监督,是自监督的过程。
在这里插入图片描述

如下图所示,a为不同的卷积,b为变形卷积,深色的点为卷积核实际采样的位置,和“标准的”位置有一定的偏移。c和d为变形卷积的特殊形式,其中c为我们常见到的空洞卷积,d为具有学习旋转特性的卷积,也具备提升感受野的能力。

变形卷积和STN过程非常类似,STN是利用网络学习出空间变换的6个参数,对特征图进行整体变换,旨在增加网络对形变的提取能力。DCN是利用网络学习数整图offset,比STN的变形更“全面一点”。STN是仿射变换,DCN是任意变换。公式不贴了,可以直接看代码实现过程。

变形卷积具有V1和V2两个版本,其中V2是在V2的基础上进行改进,除了采样offset,还增加了采样权重。V2认为3X3采样点也应该具有不同的重要程度,因此该处理方法更具有灵活性和拟合能力。
在这里插入图片描述

BlurPool

BlurPool出自论文Making Convolutional Networks Shift-Invariant Again。基于滑动窗口的卷积操作是具有平移不变性的,因此也默认为CNN网络具有平移不变性或等变性,事实上真的如此吗?实践发现,CNN网络真的非常敏感,只要输入图片稍微改一个像素,或者平移一个像素,CNN的输出就会发生巨大的变化,甚至预测错误。这可是非常不具有鲁棒性的。一般情况下利用数据增强获取所谓的不变性。本文研究发现,不变性的退化根本原因就在于下采样,无论是Max Pool还是Average Pool,抑或是stride>1的卷积操作,只要是涉及步长大于1的下采样,均会导致平移不变性的丢失。具体示例如下图所示,仅仅平移一个像素,Max pool的结果就差距很大。
在这里插入图片描述
在这里插入图片描述

为了保持平移不变性,可以在下采样之前进行低通滤波。传统的max pool可以分解为两部分,分别是stride = 1的max + 下采样 。因此作者提出的MaxBlurPool = max + blur + 下采样来替代原始的max pool。实验发现,该操作虽然不能彻底解决平移不变性的丢失,但是可以很大程度上缓解。

RFB

Receptive Field Block(RFB)出自Receptive Field Block Net for Accurate and Fast Object Detection。论文发现目标区域要尽量靠近感受野中心,这会有助于提升模型对小尺度空间位移的鲁棒性。因此受人类视觉RF结构的启发,本文提出了感受野模块(RFB),加强了CNN模型学到的深层特征的能力,使检测模型更加准确。RFB可以作为一种通用模块嵌入到绝大多数网路当中。下图可以看出其和inception、ASPP、DCN的区别,可以看作是inception+ASPP的结合。
在这里插入图片描述
在这里插入图片描述

ASFF

Adaptively Spatial Feature Fusion(ASFF)出自[Adaptively Spatial Feature Fusion](Adaptively Spatial Feature Fusion Learning Spatial Fusion for Single-Shot Object Detection)。
在这里插入图片描述

为了更加充分的利用高层语义特征和底层细粒度特征,很多网络都会采用FPN的方式输出多层特征,但是它们都多用concat或者element-wise这种融合方式,本论文认为这样不能充分利用不同尺度的特征,所以提出了Adaptively Spatial Feature Fusion,即自适应特征融合方式。FPN输出的特征图经过下面两部分的处理:

Feature Resizing:特征图的尺度不同无法进行element-wise融合,因此需要进行resize。对于上采样:首先利用1X1卷积进行通道压缩,然后利用插值的方法上采样特征图。对于1/2的下采样:利用stride=2的3X3卷积同时进行通道压缩和特征图缩小。对于1/4的下采样:在stride=2的3X3的卷积之前插入stride=2的maxpooling。

代码实现

关于这些模块的代码实现,详情可以参考我的github仓库:https://github.com/RyanCCC/CNN_Component,喜欢的可以给个star,非常感谢!

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

深度学习 卷积神经网络即插即用的小插件 的相关文章

  • Java eclipse 错误:For input string

    1 错误描述 For input string 类路径 2 什么意思 参考资料可知 For input string 表示数据类型转换错误 当一个数据类型使用 toString 方法进行转换成字符串时 转换失败就会报这个错误 3 排除错误
  • 错误 无法使用未定义类型“Ui::MainWidow“

    一 问题分析 在Qt Creator中创建Qt项目时 Creator会自动给你声明一个命名空间Ui namespace Ui class MainWindow 这是命名空间Ui里的一个类 类名是MainWindow 和你声明的MainWin
  • 安卓4.4手机运行崩溃,类无法找到,实际却是存在

    java lang RuntimeException Unable to get provider com SdkFileProvider java lang ClassNotFoundException Didn t find class
  • oracle-- 数据更新操作和事务操作

    一 sql语言操作分类 需要背 面试需要 1 数据定义语言DDL DATA DEFINE LANAGUAGE 定义 操作数据的结构 gt java的变量定义 CREATE 在数据库中创建新的数据对象 ALTER 修改数据库中对象的数据结构
  • redis:key设计原则

    redis与关系型数据库的适合场景 场景 书有标签 一本书可能有多个标签 一个标签可能对应多本书 如果是关系型数据库来存储 create table book id int title char 20 engine myisam chars

随机推荐

  • 以 STM32最小系统核心板(STM32F103C8T6)+面板板+LED 搭建电路,使用GPIO端口控制LED灯

    目录 STM32寄存器操作 寄存器的定义 寄存器操作GPIO 点灯 打开GPIO口的时钟 初始化GPIO口 选择推挽输出 设置低电平 实践操作 keil生成 hex 电路连接 芯片 烧录 总结 STM32寄存器操作 寄存器的定义 寄存器是存
  • Stable Diffusion web UI 安装教程

    Stable Diffusion web UI 安装教程 欢迎来到猫说AI wx搜索 猫说AI接入了最新版Chatgpt供大家免费使用 注意 这是ubuntu20 04安装步骤 conda创建python虚拟环境 conda create
  • pom报错,但不提示错误

    1 删除工作空间文件 workspace projects metadata plugins org eclipse m2e jdt 项目名称 container
  • Java获取指定日期的0点以及24点

    指定Date date 比如是 2022 12 09 12 34 28 获取这天的开始时间和结束时间 获得某天最大时间 2022 12 09 23 59 59 public static Date getEndOfDay Date date
  • 没有客户端执行mysql_重学MySQL:谈一谈MySQL架构

    作为一名Web后端程序员 需要经常与MySQL打交道 不过更多的时候还是停留在增删改查 CURD 的应用层面 然而随着负责项目的数据量增长和服务器硬件性能开始出现瓶颈 让我感觉有必要更加全面深入地学习与了解MySQL 以便更好地发挥MySQ
  •  使用jsp实现留言板功能

    使用jsp实现留言板功能 一 开发环境 本项目使用eclipse MySQL8 0进行开发 在开发的过程中使用了一个jar包 mysql connector java 8 0 16 jar 点我下载 二 项目结构 1 index jsp
  • 信息安全建设之开源安全产品

    对于中小企业来说 有很多免费且开源的路由器和防火墙解决方案 甚至可以作为企业的选择 这类产品中 很多都提供局域网服务 如VPN服务 热点网关和通过强制网络门户以共享无线网络 当我们在考虑安全解决方案的时候 最便于操作的肯定是商业产品 最经济
  • [整理][LaTex]小技巧之——首行缩进

    0 简介 在LaTex编辑时 有时会遇到这样一个有关于首行缩进的问题 在汉语环境的编辑下 习惯上每段会进行一个两个字的缩进 但是在默认编辑模式下 一个章节下的首段是没有首行缩进的 本文的目的主要是解决中文情况下首段缩进的情况 1 默认情况
  • Java入门 (超详细)JDK(1.8)下载与安装及环境变量的配置教程

    第一步 下载JDK 8 Oracle官网下载地址 https www oracle com java technologies javase javase8u211 later archive downloads html 进入官网JDK
  • 鸿蒙是一个怎么样的操作系统,真的是安卓套壳吗?

    从鸿蒙项目正式推出以来 就一直有各自声音 有看好的 认为鸿蒙的出现将会成为一个智能终端设备操作系统的框架和平台 促进万物互联产业的繁荣发展 也有的人在唱衰 觉得鸿蒙发展不起来 甚至认为鸿蒙只是安卓的换皮 套壳 那事实是怎么样的 鸿蒙与安卓之
  • 微信群发图文消息步骤说明

    前段时间学习微信接口开发 心得与大家分享 第一步 调用 上传下载多媒体接口 上传图片 接收微信服务器返回结果 解析获取返回的url的值 等待备用 第二步 调用 上传图文消息素材 接口 截图中红色方框标记的thumb media id的值替换
  • WireShark常用过滤规则

    一 地址过滤 对源地址及目的地址过滤 ip src 192 168 0 1 ip dst 192 168 0 1 对源地址或者目的地址过滤 ip addr 192 168 0 1 排除某个地址数据包过滤 ip addr 192 168 0
  • Linux中使用pip安装库时出现Aborted (core dumped)问题解决方案

    作者 陈玓玏 在Linux中安装上pip后 通过pip install安装python库时出现这个问题 root DZG0370 mnt c Windows System32 pip3 install pandas Downloading
  • Inno Setup 如何让生成的setup.exe文件有管理员权限

    首先 在 Setup 段 PrivilegesRequired admin 然后 找到INNO安装目录下的SetupLdr e32文件 将程序中的Manifest更改一下 用reshacker这类工具改 这样运行程序的时候 Windows
  • php use not allowed,PHP Curl - Received HTTP/0.9 when not allowed

    问题 I stumbled over a weird behavior when I try to send a post HTTP 2 0 request to apples push service http2ch curl init
  • 哈工大操作系统实验二:系统调用的实现

    实验链接 文章目录 前言 做实验前一定要先拍个快照 操作系统实验环境的搭建请看如下链接 Ubuntu系统 Linux0 11环境搭建 一 实验内容 二 基础知识 三 实验步骤 注 因为实验一已经修改过启动文件 但此次实验需要完整的启动文件
  • 小白如何做好项目管理?看这里

    作为项目管理新手 你刚被安排负责一个重要的新项目 这是你的第一个项目 是一个重大的挑战 以下这些方法可以帮你有个好的开始 成功管理你的第一个项目 一 学习和培养能力 能力发展首先要突破不知道没有能力 认识项目管理是一个职业方向 通过了解项目
  • MySql Community Downloads 社区版下载地址

    https dev mysql com downloads mysql
  • Servlet+JSP+JavaBean开发模式(MVC)介绍

    好伤心 写登陆注册之前看见一篇很好的博文 没有收藏 然后找不到了 前几天在知乎上看见一个问题 什么时候感觉最无力 前两天一直想回答 尝试过google到的所有solve case 结果bug依然在 今天想回答 明明遇见过 就是找不到那篇文的
  • 深度学习 卷积神经网络即插即用的小插件

    卷积神经网络即插即用的小插件 前言 卷积神经网络设计技巧 小插件 STN ASPP Non local SE CBAM DCN v1 v2 BlurPool RFB ASFF 代码实现 前言 本篇博客主要介绍卷积神经网络中的即插即用的模块