轻量级网络总结

2023-05-16

文章目录

  • 1. SqueezeNet
  • 2. ShuffleNet
    • 2.1 v1
    • 2.2 v2
  • 3. MobileNet
    • 3.1 v1
    • 3.2 v2
    • 3.3 v3
  • 4. GhostNet
    • 4.1 v1
    • 4.2 v2

1. SqueezeNet

SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and< 0.5 MB model size

考虑到卷积层的参数量为 C i n ∗ C o u t ∗ K ∗ K C_{in}*C_{out}*K*K CinCoutKK,显然,为了减少参数量,可以从输入输出通道数和卷积核尺寸两个角度出发:

  • 使用更多的1×1卷积
  • 减小3×3卷积的输入核输出通道数

根据以上两个基本原则,SqueezeNet中设计了一个Fire module,squeeze中只使用了1×1卷积,以较少的参数量为代价降低通道数,然后在expand中使用1×1和3×3扩展通道数。

在这里插入图片描述

class Fire(nn.Module):

    def __init__(self, inplanes, squeeze_planes,
                 expand1x1_planes, expand3x3_planes):
        super(Fire, self).__init__()
        self.inplanes = inplanes
        self.squeeze = nn.Conv2d(inplanes, squeeze_planes, kernel_size=1)
        self.squeeze_activation = nn.ReLU(inplace=True)
        self.expand1x1 = nn.Conv2d(squeeze_planes, expand1x1_planes,
                                   kernel_size=1)
        self.expand1x1_activation = nn.ReLU(inplace=True)
        self.expand3x3 = nn.Conv2d(squeeze_planes, expand3x3_planes,
                                   kernel_size=3, padding=1)
        self.expand3x3_activation = nn.ReLU(inplace=True)

    def forward(self, x):
        x = self.squeeze_activation(self.squeeze(x))
        return torch.cat([
            self.expand1x1_activation(self.expand1x1(x)),
            self.expand3x3_activation(self.expand3x3(x))
        ], 1)

2. ShuffleNet

2.1 v1

ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices

提出问题:对于深度可分离卷积,1×1占用的计算量太大
解决方案:既然3×3卷积可以通过分组减小计算量,那么1×1也可以设置为分组卷积
引出新问题:如果多个组卷积堆叠在一起,就有一个副作用----来自某个通道的输出只来自输入通道的一小部分,如下图(a)所示,导致不同组之间无信息交流。
在这里插入图片描述
进一步的解决方案:将每个组中的通道划分为几个子组,然后向下一层中的每个组提供不同的子组,如上图(b)所示,此时不同组之间进行了信息的交流。

究极解决方案:使用channel shuffle操作,即reshape->transpose->flatten,简单的操作就能均匀打乱通道。
在这里插入图片描述

def channel_shuffle(x, groups):
	b, n, h, w = x.size()
	channels_per_group = n // groups
	# reshape
	x = x.view(b, groups, channels_per_group, h, w)
	# transpose
	# transpose导致tensor不连续,而view方法需要连续的tensor,所以transpose后需要使用.contiguous()
	x = torch.transpose(x, 1, 2).contiguous()
	# flatten
	x = x.view(b, -1, h, w)
	return x

基于以上改进,设计了新的残差单元----ShuffleNet Units,(a)为使用了标准的深度可分离卷积的残差单元,(b)为使用了1×1组卷积和channel shuffle的新残差单元,(c)为stride=2时的新残差单元,在shotcut分支采用了stride=2的AVG Pool而不是1×1卷积,并且使用concat代替add操作,能够以较低的成本扩充通道数。
在这里插入图片描述

2.2 v2

ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design
提出问题:神经网络架构的设计是由间接度量(如FLOPs)来指导的,但是实验表明,具有相似FLOPs的网络具有不同的速度(如下图所示),因此,使用FLOPs作为计算复杂度的唯一度量是不够的,可能会导致次优设计。
在这里插入图片描述
间接(FLOPs)和直接(速度)指标之间的差异可以归结于两个主要原因

  • 内存访问成本(MAC)和并行度:组卷积等高MAC操作(分组会导致读写操作成倍增加)可能会成为GPU的瓶颈;并行度高的模型比其他并行度低的模型快得多。
  • 根据平台的不同,具有相同流程的操作可能有不同的运行时间,如GPU和ARM

解决方案:对于有效的网络架构设计,应该考虑两个原则。首先,应该使用直接度量(例如,速度),而不是间接度量(例如,FLOPs)。其次,这些指标应该在目标平台上进行评估。

贡献
(1)推导了四种高效网络设计的指导方针

  • G1: 输入输出通道数相等可尽量降低内存访问成本(MAC):轻量级网络中常使用深度可分离卷积,其中点卷积计算复杂度最大,因此以点卷积为例进行分析。假设输入输出通道数分别为 C i n C_{in} Cin C o u t C_{out} Cout,特征图尺寸为 H × W H×W H×W,在bias=False的情况下,浮点运算次数 B = H × W × C o u t × C i n B=H×W×C_{out}×C_{in} B=H×W×Cout×Cin;假设计算设备中的缓存大到足以存储features和weight, M A C = H × W × ( C o u t + C i n ) + C o u t × C i n MAC=H×W×(C_{out}+C_{in})+C_{out}×C_{in} MAC=H×W×(Cout+Cin)+Cout×Cin。在固定FLOPs的情况下,根据均值不等式有:
    在这里插入图片描述 因此,MAC有一个由FLOPs给出的下界。当输入通道和输出通道的数量相等时,MAC达到下界。

  • G2: 过度的组卷积会增加MAC:对于分组卷积,浮点运算次数 B = ( H × W × C o u t × C i n ) / g B=(H×W×C_{out}×C_{in}) / g B=(H×W×Cout×Cin)/g,MAC与FLOPs的关系如下:
    在这里插入图片描述 显然,固定FLOPs时,MAC随着分组数g的增大而增大。

  • G3: 网络碎片化降低并行度:虽然多分支这种碎片化的结构已被证明有利于提升网络性能,但它可能会降低效率,因为它对像GPU这样具有强大并行计算能力的设备不友好。还引入了额外的开销,如内核启动和同步。

  • G4: 元素级操作是不可忽略的:在如shufflenet-v1和mobilenet-v2这样的轻量级模型中,元素级操作占用了相当多的时间,特别是在GPU上。元素级操作包括ReLU、Add等,虽然FLOPs很小,但是MAC较高。
    在这里插入图片描述

(2)基于推导的四种高效网络设计的指导方针,设计了新的轻量级残差模块(如下图,a、b是v1中的单元结构,c、d是v2中的单元结构):通过channel split保证输入输出通道数相等,符合G1; 将1×1分组卷积替换为标准的1×1卷积,符合G2和G3(因为分组卷积是碎片化结构);将Add替换为Concat,并去掉了最后的ReLU,替换为channel shuffle,符合G4。

在这里插入图片描述

3. MobileNet

3.1 v1

MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications
提出了深度可分离卷积,能够大幅减少参数量和计算量:
在这里插入图片描述
假设输入通道和输出通道数分别为 N N N M M M,卷积核尺寸为 D K × D K D_K×D_K DK×DK,输出特征图尺寸为 D F × D F D_F×D_F DF×DF,那么标准卷积的计算量为:
在这里插入图片描述
深度可分离卷积的计算量为:
在这里插入图片描述
计算量降低了:
在这里插入图片描述
有一点需要注意,由于Depthwise卷积使用了分组卷积,因此适用于移动端等流水线型平台,对GPU不友好。

3.2 v2

MobileNetV2: Inverted Residuals and Linear Bottlenecks

3.3 v3

Searching for MobileNetV3

4. GhostNet

4.1 v1

GhostNet: More Features from Cheap Operations
提出了轻量级模块Ghost module,简单来说,其实就是将深度可分离卷积倒过来,先PW卷积再DW卷积,只是减少了PW卷积数量,然后通过identity补上通道数,从而既能扩展输出通道数又能减少参数量和计算量。
在这里插入图片描述

4.2 v2

GhostNetV2: Enhance Cheap Operation with Long-Range Attention

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

轻量级网络总结 的相关文章

  • c#webservice的简单示例

    是webservice 就概念上来说 xff0c 可能比较复杂 xff0c 不过我们可以有个宏观的了解 xff1a webservice就是个对外的接口 xff0c 里面有 函数可供外部客户调用 xff08 注意 xff1a 里面同样有客户
  • 实现常规厂家&品牌&型号业务对接物联网平台(snack3加json赋能)

    前言 之前介绍过通过snack3快速对接物模型 xff0c 不知道大家还有没有影响 记得还留了一个作业给大家想想 xff0c 就是这么兼容多型号 多版本 xff0c 这次就来跟大家分享下这么集成多型号 一 物模型文件调整 上次是利用snac
  • 组合OSS服务实现打包业务文件zip下载

    前言 实现文件打包成zip下载 xff0c 支持zip包含目录 文件 废话不多说 xff0c 直接上码 一 设计思路 后端组织文件 xff0c 打包成zip上传到OSS存储返回文件名称给前端前端根据返回的文件名称 xff08 url xff
  • Spring Boot + Disruptor = 王炸!!

    01 背景 工作中遇到项目使用Disruptor做消息队列 对你没看错 不是Kafka 也不是rabbitmq Disruptor有个最大的优点就是快 还有一点它是开源的哦 下面做个简单的记录 02 Disruptor介绍 Disrupto
  • Dbeaver连接ES问题一站解决

    前言 最近几天一直做ES的TPS测试 xff0c 每次看数据ES的数据都在嫌麻烦 xff08 在postman指定索引通过url请求查看数据 xff09 最后决定还是整整Dbeaver连接ES 一 当前境况 1 ES版本比较老 xff0c
  • Dbeaver连接TDengine时序数据库

    前言 还是结合上一阶段的工作 xff0c 为TPS满足合同里的要求 xff0c 预研数据库切换为TDengine 所以查看数据的工具我得能连上去看 xff0c 习惯了Dbeaver xff0c 所以先把Dbeaver整的能连接使用 一 Db
  • idea+ApifoxUploader+Apifox真是内外双修,香

    前言 最近部门为整合后端组 前端组 测试组 需求组 产品组等组之间的工作流程 xff0c 旨在提高协调与高效 xff0c 其中之一就是希望开发组 xff08 后端 前端 xff09 开发的接口能及时更新 xff0c 测试组能做接口测试 xf
  • SpringBoot3+最新MybatisPlus+Mysql与TDengine双数据源

    前言 昨天写的idea 43 Apifox uploader插件 43 apifox新年第一天上班就上榜了 xff0c 真是不错 今天来补一篇 xff0c 本来应该是在前一篇之前发的 实际上就是最新的springBoot集成最新的mybat
  • 业务平台扩展支持TDengine时序数据库方案

    1 场景与架构 1 1业务架构 这里涉及项目隐私 xff0c 架构图不方便公开 大致情况就是 xff1a 应用层的园区畅行 生态宜居 安全守护是我方要交付的系统 平台层的物联网感知中台是我方平台 1 2数据架构 从数据架构看 xff0c 园
  • 物联网平台+业务平台基本架构设计与优化想法

    前言 目前的交付底座有点老 xff0c 而且集成的有点杂 xff0c 计划是要升级下 xff0c 先说想法 xff0c 看领导做不做 1 业务平台定位 我们的愿景 xff1a 通过物联平台赋能 xff0c 让数据产生价值 为客户提供可视化的
  • Qt 正则表达式匹配失败的一个原因

    在Qt中做正则表达式时 xff0c 遇到一个很坑爹的问题 xff0c 还是经验不足导致 在正则表达式中 xff0c 有很多需要元字符 xff0c 是需要使用普通字符加转义符号搭配使用的 比如 w xff0c s 对于这类字符 xff0c 在
  • C++对象模型(整理)

    C 43 43 对象模型 1 何为C 43 43 对象模型 xff1f C 43 43 对象模型可以概括为以下2部分 xff1a 语言中直接支持面向对象程序设计的部分 面向对象程序设计部分 xff1a 如构造函数 析构函数 虚函数 继承 x
  • MybatisPlus多表查询之零sql编写实现

    1 前言 年初节奏还没有快起来 xff0c 适合做做技术前瞻 xff0c 无论是对个人还是团队都是好事 真要说分享 xff0c 其实感觉也没啥好分享的 xff0c 就像接手新项目一样 xff0c 代码都是自己看 xff0c 别人讲的再多 x
  • 物联网设备流水入库TDengine改造方案

    1 存储机制改造 针对提出的流水查询需求 xff0c 结合设备上报数据讨论后 xff0c 初步定以下几种方案 1 1 ES gt TDengine 1 ES入库有延时 2 ES没有提供数据监听API xff08 不能主动监听 xff0c 实
  • SpringBoot3集成Kafka优雅实现信息消费发送

    前言 首先 xff0c 你的JDK是否已经是8 43 了呢 xff1f 其次 xff0c 你是否已经用上SpringBoot3了呢 xff1f 最后 xff0c 这次分享的是SpringBoot3下的kafka发信息与消费信息 一 场景说明
  • SpringBoot3集成TDengine自适应裂变存储

    前言 首先很遗憾的告诉大家 xff0c 今天这篇分享要关注才可以看了 原因是穷啊 xff0c 现在基本都是要人民币玩家了 xff0c 就比如chatGPT copilot xff0c 这些AI虽然都是可以很好的辅助编码 xff0c 但是都是
  • Github Copilot编码神剑

    前言 今天跟大家分享的其实是现在比较火的Github copilot xff0c 另外 xff0c 就是分享下它的优雅使用 其实知道用这个以后 xff0c 瑟瑟发抖 xff0c 感觉就要失业了 不过真正用过后 xff0c 其实发现这要完全取
  • 一个基于缓存的业务链路日志记录设计方案

    前言 一个简单的全接口日志设计文档 xff0c 先分享设计文档 xff0c 后面分享核心设计代码 1 对外接口设计原则 1 1 基本原则 对外接口要遵守的基本原则 xff1a 1 开闭原则 2 依赖倒置原则 3 单一职责原则 4 接口隔离原
  • 基于缓存的统一请求日志实现

    前言 昨天说的会分享方案的具体实现 xff0c 今天就来分享想核心代码吧 一 思路 我们用的是springboot组服务 xff0c 每个链路通过http请求 所以要实现全链路的日志记录 xff0c 也都是围绕sprinboot做的处理 这

随机推荐

  • SpringBoot集成ChatGPT实现AI聊天

    前言 ChatGPT已经组件放开了 xff0c 现在都可以基于它写插件了 但是说实话我还真没想到可以用它干嘛 xff0c 也许可以用它结合文字语音开发一个老人小孩需要的智能的说话陪伴啥的 今天我就先分享下SpringBoot结合ChatGP
  • activemq 延时队列以及不生效问题

    最近在做的项目中有一个业务涉及到了订单的有效期的问题 xff08 即订单达到一定的时间未支付完成就让该订单失效 xff09 xff0c 于是就想到了延时队列的方式 xff0c 由于项目采用的是activemq xff0c 所以就写了个act
  • elasticsearch的分布式架构原理

    对于全文检索 xff0c lucene是目前最流行的搜索库 以前我们都需要学习使用lucene 基于lucene做相关的开发 xff0c 学习倒排索引的原理 xff0c 而现在 xff0c 我们可以直接使用现成的搜索框架了 xff0c 因为
  • vscode设置代理

    1 通过命令行方式设置 参考 xff1a https liliyuanshangcaoyisuiyikurongyehuoshaobujinchunfengchuiyousheng com 2021 vscode socks5 proxy
  • springboot oa 办公系统,springboot权限系统

    springboot oa 自动化办公系统 43 springboot 完整权限管理系统合二为一 xff01 办公自动化 xff08 OA xff09 是面向组织的日常运作和管理 xff0c 员工及管理者使用频率最高的应用系统 xff0c
  • linux下的shell运算(加、减、乘、除)

    关注微信公众号 虾米聊吧 获取所有资料干货 xff0c 每天更新技术干货 xff0c 一起交流一起学习 i 61 j 43 k 等价于 i 61 96 expr j 43 k 96 i 61 j k 等价于 i 61 96 expr j k
  • 仿QQ聊天程序(java)

    简易版qq聊天 xff1a qq聊天 简易版 resourcecode cn 推荐java最新聊天项目 xff08 java仿微信聊天 xff09 java 简单仿微信聊天 springboot Garry1115的博客 CSDN博客 sp
  • yum出错Error: Cannot find a valid baseurl for repo: base

    关注微信公众号 虾米聊吧 xff0c 每天更新一篇技术文章 xff0c 文章内容涵盖架构师成长必经之路应掌握的技术 xff0c 一起学习 xff0c 一起交流 最近在安装mysql的rpm包时 xff0c 出现了一个问题 xff0c 当使用
  • java web简单权限管理设计

    注 xff1a 由于该项目比较老 xff0c 所以没有采用maven管理 xff0c 建议下载java后台通用权限管理系统 springboot xff09 xff0c 对学习和使用会更有帮助 最近在做一个网站类型项目 xff0c 主要负责
  • C/C++ 开发神器 CLion 使用入门

    关注微信公众号 虾米聊吧 xff0c 每天分享知识干货 xff0c 和博主一起打卡 xff0c 进步 CLion是Jetbrains公司旗下新推出的一款专为开发C C 43 43 所设计的跨平台IDE xff0c 它是以IntelliJ为基
  • java后台通用权限管理系统(springboot)

    推荐 xff1a Java秒杀系统优化 高性能高并发 xff08 Java秒杀系统优化 高性能高并发 Garry1115的博客 CSDN博客 xff09 说明 xff1a 这是本人正在使用的一款通用权限管理系统 来源 xff1a 通过对网上
  • Kali Linux-2021.4a下载安装全过程

    一 镜像下载 xff1b 下载镜像地址通过阿里云开源镜像站进行下载 xff1b https mirrors aliyun com kali images 二 系统安装 xff1b 说明 xff1a 本次安装流程通过虚拟机进行 1 虚拟机配置
  • RH8的ansible安装与配置

    Ansible安装与配置 自定义环境 角色主机名ip地址组名控制主机server example com192 168 157 100server受控主机1node1 example com192 168 157 134node1受控主机2
  • UOS开发者调试签名

    开发者调试签名 2022 01 18 20 03 03 一 证书生成 xff08 1 xff09 打开统信应用商店 xff0c 搜索 证书工具 xff0c 单击安装证书工具 xff08 2 xff09 使用cert tool工具生成证书 执
  • JAVA 分解质因数

    7 3 分解质因数 求出区间 a b 中所有整数的质因数分解 输入格式 输入两个整数a xff0c b 数据规模和约定 2 lt 61 a lt 61 b lt 61 10000 输出格式 每行输出一个数的分解 xff0c 形如k 61 a
  • 使用customRef自定义ref,解决setup中处理异步问题。

    setup中不允许使用async await使用customRef可以让请求到的数据自动获取响应式状态详见下方demo lt template gt lt div gt num lt div gt lt button 64 click 61
  • apache2.4 中文乱码问题

    PHP ini里面的default charset 61 34 UTF 8 34 lt meta http equiv 61 34 content type 34 content 61 34 text html charset 61 UTF
  • VScode自定义配置代码片段详细教程(附带转码链接)

    目录 前言 1 定义自己常用的代码片段 2 通过转码链接进转译 3 Vscode中设置 3 1找到配置代码片段进行设置 3 2点击全局配置进入粘贴转译过的代码 4 检验自定义代码段是否成功 小结 xff1a 前言 众所周知在VScode的h
  • 注意力机制总结

    文章目录 1 通道注意力1 1 SENet xff08 谁用谁知道 xff0c 用了都说好 xff09 2 通道 amp 空间2 1 CBAM2 2 scSE2 3 Coordinate Attention 3 self attention
  • 轻量级网络总结

    文章目录 1 SqueezeNet2 ShuffleNet2 1 v12 2 v2 3 MobileNet3 1 v13 2 v23 3 v3 4 GhostNet4 1 v14 2 v2 1 SqueezeNet SqueezeNet A