即插即用模块详解SCConv:用于特征冗余的空间和通道重构卷积

目录

一、摘要

二、创新点说明

2.1 Methodology

 2.2SRU for Spatial Redundancy​编辑

2.3CRU for Channel Redundancy

三、实验

3.1基于CIFAR的图像分类

3.2基于ImageNet的图像分类

3.3对象检测

四、代码详解

五、总结


论文:https://openaccess.thecvf.com/content/CVPR2023/papers/Li_SCConv_Spatial_and_Channel_Reconstruction_Convolution_for_Feature_Redundancy_CVPR_2023_paper.pdf

代码:GitHub - cheng-haha/ScConv: SCConv: Spatial and Channel Reconstruction Convolution for Feature Redundancy

一、摘要

卷积神经网络(cnn)在各种计算机视觉任务中取得了显著的性能,但这是以巨大的计算资源为代价的,部分原因是卷积层提取冗余特征。最近的作品要么压缩训练有素的大型模型,要么探索设计良好的轻量级模型。在本文中,我们尝试利用特征之间的空间和通道冗余来进行CNN压缩,并提出了一种高效的卷积模块,称为SCConv (spatial and channel reconstruction convolution),以减少冗余计算并促进代表性特征的学习。提出的SCConv由空间重构单元(SRU)和信道重构单元(CRU)两个单元组成。SRU采用分离重构的方法来抑制空间冗余,CRU采用分离变换融合的策略来减少信道冗余。此外,SCConv是一种即插即用的架构单元,可直接用于替代各种卷积神经网络中的标准卷积。实验结果表明,SCConv嵌入模型能够通过减少冗余特征来获得更好的性能,并且显著降低了复杂度和计算成本。

论文贡献总结:

       1. 提出了一种空间重构单元SRU,该单元根据权重分离冗余特征并进行重构,以抑制空间维度上的冗余,增强特征的表征能力。
       2. 我们提出了一种信道重构单元,称为CRU,它利用分裂变换和融合策略来减少信道维度的冗余以及计算成本和存储。
        3.我们设计了一种名为SCConv的即插即用操作,将SRU和CRU以顺序的方式组合在一起,以取代标准卷积,用于在各种骨干cnn上操作。结果表明,SCConv可以大大节省计算负荷,同时提高模型在挑战性任务上的性能。

二、创新点说明

2.1 Methodology

SCConv,它由两个单元组成,空间重建单元(SRU)和通道重建单元(CRU),以顺序的方式放置。具体而言,对于瓶颈残差块中的中间输入特征X,我们首先通过SRU运算获得空间细化特征Xw,然后利用CRU运算获得信道细化特征Y。我们在SCConv模块中利用了特征之间的空间冗余和通道冗余,可以无缝集成到任何CNN架构中,以减少中间特征映射之间的冗余并增强CNN的特征表示。

 2.2SRU for Spatial Redundancy

为了利用特征的空间冗余,我们引入了空间重构单元(SRU),如图2所示,它利用了分离和重构操作。分离操作的目的是将信息丰富的特征图与空间内容对应的信息较少的特征图分离开来。

2.3CRU for Channel Redundancy

为了利用特征的信道冗余,我们引入了信道重构单元(CRU),如图3所示,它利用了分裂-转换-融合策略。

三、实验

3.1基于CIFAR的图像分类

3.2基于ImageNet的图像分类

3.3对象检测

四、代码详解

import torch  # 导入 PyTorch 库
import torch.nn.functional as F  # 导入 PyTorch 的函数库
import torch.nn as nn  # 导入 PyTorch 的神经网络模块# 自定义 GroupBatchnorm2d 类,实现分组批量归一化
class GroupBatchnorm2d(nn.Module):def __init__(self, c_num:int, group_num:int = 16, eps:float = 1e-10):super(GroupBatchnorm2d,self).__init__()  # 调用父类构造函数assert c_num >= group_num  # 断言 c_num 大于等于 group_numself.group_num  = group_num  # 设置分组数量self.gamma      = nn.Parameter(torch.randn(c_num, 1, 1))  # 创建可训练参数 gammaself.beta       = nn.Parameter(torch.zeros(c_num, 1, 1))  # 创建可训练参数 betaself.eps        = eps  # 设置小的常数 eps 用于稳定计算def forward(self, x):N, C, H, W  = x.size()  # 获取输入张量的尺寸x           = x.view(N, self.group_num, -1)  # 将输入张量重新排列为指定的形状mean        = x.mean(dim=2, keepdim=True)  # 计算每个组的均值std         = x.std(dim=2, keepdim=True)  # 计算每个组的标准差x           = (x - mean) / (std + self.eps)  # 应用批量归一化x           = x.view(N, C, H, W)  # 恢复原始形状return x * self.gamma + self.beta  # 返回归一化后的张量# 自定义 SRU(Spatial and Reconstruct Unit)类
class SRU(nn.Module):def __init__(self,oup_channels:int,  # 输出通道数group_num:int = 16,  # 分组数,默认为16gate_treshold:float = 0.5,  # 门控阈值,默认为0.5torch_gn:bool = False  # 是否使用PyTorch内置的GroupNorm,默认为False):super().__init__()  # 调用父类构造函数# 初始化 GroupNorm 层或自定义 GroupBatchnorm2d 层self.gn = nn.GroupNorm(num_channels=oup_channels, num_groups=group_num) if torch_gn else GroupBatchnorm2d(c_num=oup_channels, group_num=group_num)self.gate_treshold  = gate_treshold  # 设置门控阈值self.sigomid        = nn.Sigmoid()  # 创建 sigmoid 激活函数def forward(self, x):gn_x        = self.gn(x)  # 应用分组批量归一化w_gamma     = self.gn.gamma / sum(self.gn.gamma)  # 计算 gamma 权重reweights   = self.sigomid(gn_x * w_gamma)  # 计算重要性权重# 门控机制info_mask    = reweights >= self.gate_treshold  # 计算信息门控掩码noninfo_mask = reweights < self.gate_treshold  # 计算非信息门控掩码x_1          = info_mask * x  # 使用信息门控掩码x_2          = noninfo_mask * x  # 使用非信息门控掩码x            = self.reconstruct(x_1, x_2)  # 重构特征return xdef reconstruct(self, x_1, x_2):x_11, x_12 = torch.split(x_1, x_1.size(1) // 2, dim=1)  # 拆分特征为两部分x_21, x_22 = torch.split(x_2, x_2.size(1) // 2, dim=1)  # 拆分特征为两部分return torch.cat([x_11 + x_22, x_12 + x_21], dim=1)  # 重构特征并连接# 自定义 CRU(Channel Reduction Unit)类
class CRU(nn.Module):def __init__(self, op_channel:int, alpha:float = 1/2, squeeze_radio:int = 2, group_size:int = 2, group_kernel_size:int = 3):super().__init__()  # 调用父类构造函数self.up_channel     = up_channel = int(alpha * op_channel)  # 计算上层通道数self.low_channel    = low_channel = op_channel - up_channel  # 计算下层通道数self.squeeze1       = nn.Conv2d(up_channel, up_channel // squeeze_radio, kernel_size=1, bias=False)  # 创建卷积层self.squeeze2       = nn.Conv2d(low_channel, low_channel // squeeze_radio, kernel_size=1, bias=False)  # 创建卷积层# 上层特征转换self.GWC            = nn.Conv2d(up_channel // squeeze_radio, op_channel, kernel_size=group_kernel_size, stride=1, padding=group_kernel_size // 2, groups=group_size)  # 创建卷积层self.PWC1           = nn.Conv2d(up_channel // squeeze_radio, op_channel, kernel_size=1, bias=False)  # 创建卷积层# 下层特征转换self.PWC2           = nn.Conv2d(low_channel // squeeze_radio, op_channel - low_channel // squeeze_radio, kernel_size=1, bias=False)  # 创建卷积层self.advavg         = nn.AdaptiveAvgPool2d(1)  # 创建自适应平均池化层def forward(self, x):# 分割输入特征up, low = torch.split(x, [self.up_channel, self.low_channel], dim=1)up, low = self.squeeze1(up), self.squeeze2(low)# 上层特征转换Y1 = self.GWC(up) + self.PWC1(up)# 下层特征转换Y2 = torch.cat([self.PWC2(low), low], dim=1)# 特征融合out = torch.cat([Y1, Y2], dim=1)out = F.softmax(self.advavg(out), dim=1) * outout1, out2 = torch.split(out, out.size(1) // 2, dim=1)return out1 + out2# 自定义 ScConv(Squeeze and Channel Reduction Convolution)模型
class ScConv(nn.Module):def __init__(self, op_channel:int, group_num:int = 16, gate_treshold:float = 0.5, alpha:float = 1/2, squeeze_radio:int = 2, group_size:int = 2, group_kernel_size:int = 3):super().__init__()  # 调用父类构造函数self.SRU = SRU(op_channel, group_num=group_num, gate_treshold=gate_treshold)  # 创建 SRU 层self.CRU = CRU(op_channel, alpha=alpha, squeeze_radio=squeeze_radio, group_size=group_size, group_kernel_size=group_kernel_size)  # 创建 CRU 层def forward(self, x):x = self.SRU(x)  # 应用 SRU 层x = self.CRU(x)  # 应用 CRU 层return xif __name__ == '__main__':x       = torch.randn(1, 32, 16, 16)  # 创建随机输入张量model   = ScConv(32)  # 创建 ScConv 模型print(model(x).shape)  # 打印模型输出的形状

五、总结

在本文中,我们提出了一种新的空间和信道重构模块(SCConv),这是一种有效的架构单元,可以降低计算成本和模型存储,同时通过减少标准卷积中广泛存在的空间和信道冗余来提高CNN模型的性能。我们使用两个不同的模块SRU和CRU来减少特征映射中的冗余,在减少大量计算负载的同时实现了相当大的性能改进。此外,SCConv是一个即插即用的模块,可以替代标准的卷积,不需要任何模型架构的调整。此外,各种SOTA方法在图像分类和目标检测方面的大量实验表明,scconvn嵌入模型在性能和模型效率之间取得了更好的平衡。最后,我们希望所提出的方法可以启发研究更有效的建筑设计。

参考:大佬

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/821892.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue2/Vue3项目中,通过请求接口来刷新列表中的某个字段(如:Axios)

vue2/Vue3项目中&#xff0c;通过请求接口来刷新列表中的某个字段。可以使用 Vue 的异步请求库&#xff08;如 Axios&#xff09;来发送请求&#xff0c;并在请求成功后更新相应的字段。 示例如下&#xff08;Vue2&#xff09;&#xff1a; 简单的示例如下&#xff0c;假设列…

在Qt中如何简单设计一个文件和图像浏览器

文本浏览器 设计一个文本浏览器程序&#xff0c;可以打开、显示 txt、html等文件。 1.在Qt Designer中设计一个菜单其中包含打开和退出选项&#xff1a; 2. 在 QMainWindow 构造函数中把 textBrower 设为主窗口的中心部件&#xff0c;这样整个窗口就成了包含 textBrower 的单文…

jetson nx安装nomachine后无法进入linux shell

以下问题都是一个原因造成的 我在jetson nx上安装了nomachine后&#xff0c;连接时需要登陆用户名和密码&#xff0c;那这个用户名密码是什么&#xff0c;我使用系统的用户名和密码返回错误。login as a system user on this server总是failed&#xff0c;直接登录ssh输入用户…

nginx-http-flv配置

hls配置 hls配置放在 http.server里面 http {server {# HTTP监听端口listen 8002;location /hls {types {application/vnd.apple.mpegurl m3u8;video/mp2t ts;}alias ./temp/hls; # HLS文件存放路径&#xff0c;请替换为你实际的路径expires -1;add_header Cache-Control no…

你的RPCvs佬的RPC

一、课程目标 了解常见系统库的hook了解frida_rpc 二、工具 教程Demo(更新)jadx-guiVS CodejebIDLE 三、课程内容 1.Hook_Libart libart.so: 在 Android 5.0&#xff08;Lollipop&#xff09;及更高版本中&#xff0c;libart.so 是 Android 运行时&#xff08;ART&#x…

ubuntu手动编译opencv 4.9.0遇到的问题汇总

ubuntu手动编译opencv 4.9.0遇到的问题汇总 编译流程 以4.9.0版本为例&#xff0c;可参考&#xff1a;https://docs.opencv.org/4.9.0/d2/de6/tutorial_py_setup_in_ubuntu.html 编译加速 https://blog.csdn.net/tfb760/article/details/104030841 ippicv_2021.10.0_lnx_i…

细说postgresql之pg_rman备份恢复 —— 筑梦之路

pg_rman是一款开源的备份恢复软件&#xff0c;支持在线和基于PITR的备份恢复方式。 pg_rman类似于oracle的rman&#xff0c;可以进行全量、增量、归档日志的备份。 运行模式&#xff1a; 安装部署 Releases ossc-db/pg_rman GitHub 1、需要根据PG Server的版本&#xff0c;下…

聊天机器人ChatGPT指导下的论文写作

ChatGPT无限次数:点击直达 聊天机器人ChatGPT指导下的论文写作 引言 随着人工智能技术的不断发展&#xff0c;聊天机器人在各个领域得到了广泛应用。其中&#xff0c;ChatGPT作为一个先进的自然语言处理模型&#xff0c;为各种文本生成任务提供了强大的支持。在学术界&#xf…

ThreadLocal和ThreadLocalHashMap

请直接百度详细介绍 -------------------------------------------------------------------------------------------------------------------------------- 1.ThreadLocalMap是Thread类里的一个局部变量 2.ThreadLocalMap是ThreadLocal类里的一个静态内部类, 3.ThreadL…

浅谈对称加密(AES与DES)

浅谈对称加密&#xff08;AES与DES&#xff09; 对称加密是一种加密方式&#xff0c;其中同一个密钥&#xff08;也称为私钥或共享密钥&#xff09;用于加密和解密数据。这意味着加密和解密都使用相同的密钥。对称加密速度通常很快&#xff0c;因为它不涉及复杂的数学运算。 …

10. Spring MVC 程序开发

本文源码位置: Spring-MVC 1. Spring MVC 概要 摘自Spring官方&#xff1a; Spring Web MVC is the original web framework built on the Servlet API and has been included in the Spring Framework from the very beginning. The formal name, “Spring Web MVC,” comes …

Adobe AE(After Effects)2015下载地址及安装教程

Adobe After Effects是一款专业级别的视觉效果和动态图形处理软件&#xff0c;由Adobe Systems开发。它被广泛用于电影、电视节目、广告和其他多媒体项目的制作。 After Effects提供了强大的合成和特效功能&#xff0c;可以让用户创建出令人惊艳的动态图形和视觉效果。用户可以…

大创项目推荐 深度学习YOLOv5车辆颜色识别检测 - python opencv

文章目录 1 前言2 实现效果3 CNN卷积神经网络4 Yolov56 数据集处理及模型训练5 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习YOLOv5车辆颜色识别检测 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0…

速盾:js插件可以用cdn加速吗?

随着互联网技术的发展&#xff0c;网页的加载速度成为了用户体验的重要指标之一。在传统的Web开发中&#xff0c;为了提高网页的加载速度&#xff0c;通常会将静态文件如图片、样式表、脚本等存放在CDN&#xff08;Content Delivery Network&#xff09;上&#xff0c;以实现全…

嵌入式学习55-ARM4(ADC和I²C)

1、什么是ADC,模拟量和数字量有什么特点&#xff1f; ADC&#xff1a; …

Ubuntu Vs code配置ROS开发环境

文章目录 1.开发环境2.集成开发环境搭建2.1 安装Ros2.2 安装 Vs code2.3 安装vs code 插件 3.Vs code 配置ROS3.1 创建ROS工作空间3.2 从文件夹启动Vs code3.3 使用Vscode 编译ROS 空间3.4 使用Vs code 创建功能包 4.编写简单Demo实例4.1编写代码4.2编译与执行 1.开发环境 系统…

.NET/C#汇总 —— ASP.NET MVC

1.MVC中的TempData\ViewBag\ViewData区别? TempData 保存在Session中,Controller每次执⾏请求的时候,会从Session中先获取 TempData, ⽽后清除Session,获取完TempData数据,虽然保存在内部字典对象中,但是其集合中的每个条⽬访问 ⼀次后就从字典表中删除,ViewData存的是…

Sql server备份还原sql语句

使用备份文件指定新的数据库名称 USE MASTER --这里注意要使用MASTER&#xff0c;以免出现待还原库被占用的情况 RESTORE DATABASE [tsw_test] --为待还原库名 FROM DISK C:\Program Files\Microsof…

【行为型模式】观察者模式

一、观察者模式概述​ 软件系统其实有点类似观察者模式&#xff0c;目的&#xff1a;一个对象的状态或行为的变化将导致其他对象的状态或行为也发生改变&#xff0c;他们之间将产生联动。 观察者模式属于对象行为型&#xff1a; 1.定义了对象之间一种一对多的依赖关系&#xff…