理解分组卷积与深度可分离卷积

2023-11-11

这两种卷积分别是在ResNext论文与MobileNet系列中体现的,貌似Xception中也有深度可分离卷积的体现。

作用都很简单,为了降参。

目录

1. 分组卷积 group convolution 

2 深度可分离卷积 depthwise separable convolution


1. 分组卷积 group convolution 

最早出现分组卷积的是AlexNet,说实话网上介绍的blog直接一贴我也没看懂AlexNet中是如何用分组卷积的,只知道现在因为计算资源上去了,大家已经不在把数据分在两块GPU上去搞了,贴个blog有兴趣的可以去看AlexNet中如何降参用分组卷积的。https://www.cnblogs.com/wangguchangqing/p/10333370.html

分组卷积,顾名思义就是相较原始卷积我们整合所有通道特征图的值,分组卷积只整合本组通道内特征图的值,话不多说上图。

这是标准卷积的操作,输入特征图为C1×H×W,我们用C2×C1×h1×w1的卷积核执行标准卷积操作,得到C2×H×W的output特征图,对于输出特征图上的每一个点,都是在输入特征图全部通道(C1)执行multi-add操作得到的。

这是分组卷积操作,输入特征图为C1×H×W,我们按照通道数分为g个组,每个组的特征通道数量为C1/g,这个时候我们用C2/g × C1/g × h1 ×w1的卷积核去对每一组进行卷积,得到C2/g × H × W的output特征图,又我们一共有g个组,所以最终拼接所有C2/g × H × W的output特征图,又可以得到和标准卷积尺度一样的output特征图,即C2×H×W。

以上就是分组卷积的操作,Alex认为分组卷积的方式可以增加filter之间的对角相关性(没理解为什么,可能就是类似dropout形势,组内的特征可以独立发挥最终特征预测作用,而不是通过与其他特征组合导致,减少耦合增加鲁棒吧。),可以减少训练参数,Group Convolution可以看成是structured sparse,对上图所示的,C2/g × C1/g × h1× w1卷积核可以看作C2/g ×(C1 - C1/g)× h1 × w1这部分卷积核的值为0,有时甚至可以在减少参数量的同时获得更好的效果(相当于正则)。

2 深度可分离卷积 depthwise separable convolution

深度可分离卷积是在mobileNet和Xception中都有涉及的一个操作,在看完分组卷积后,我们考虑一种特殊情况,如果输入特征图的尺寸等于输出特征图的尺寸(H × W不变),如果我们把输入特征图的通道数C1分成C1个组,也就是每个组都只有1个通道,那么我们用1 × 1 × K × K的卷积核来对每组进行卷积,同时拼接C1个组的结果,得到输出特征图的通道仍为C1 × H × W,这其实就是深度可分离卷积。

对于可分离卷积,我认为其可以分为两种形式,一种是空间可分离卷积,顾名思义,空间可分离就是将一个大的卷积核变成两个小的卷积核,也就是在inception系列中出现的把3 × 3卷积分成对称的1×3与3×1的操作,另一种就是深度可分离卷积,深度可分离卷积也可分为两部分,深度卷积+逐点卷积,深度卷积就是在每个通道上执行卷积,但是不整合所有对应通道上的结果(没有通道级别对应的add操作),逐点卷积就是1*1卷积。

话不多说上图

图(a)代表标准卷积。假设输入特征图尺寸为  M*H*W,卷积核尺寸为M*D_{k}*D_{k}   ,个数为N个,输出特征图尺寸为N*H*W,标准卷积层的参数量为:N*M*D_{k}*D_{k} 。

图(b)就是深度卷积,把输入特征图上的每一个通道单独执行卷积操作,也就是用M个1*D_{k}*D_{k}的卷积核对输入特征图上的每一个通道执行卷积操作,最终得到的输出特征图的尺寸仍然为M*H*W,参数数量为M*D_{k}*D_{k}

图(c)为逐点卷积,也就是常规的1×1卷积操作,输入特征图为M*H*W,卷积核的尺寸为M*1*1  ,个数为N个,输出特征图尺寸为N*H*W。参数数量为N*M

那么图b与图c的结合就是深度可分离卷积了,深度可分离卷积作用就是降参咯,我们来对比一下标准卷积与深度可分离卷积:

 \frac{ (M*D_{k}*D_{k}+N*M)}{N*M*D_{k}*D_{k}}=\frac{1}{N}+\frac{1}{D_{k}^{2}}

如果我们用3 * 3的卷积,那么相当于我们大约可以减少10倍的参数计算量。

对于深度可分离卷积,在MobileNet1中比标准卷积在ImageNet上降低了约1%的精度。

性能下降一点的原因我觉得也比较明显吧,就是通道数太少,特征图的维度太少,能获取到足够的有效信息吗?

参考:

https://zhuanlan.zhihu.com/p/70703846  这篇对moblieNet系列介绍比较全面,推!~

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

理解分组卷积与深度可分离卷积 的相关文章

随机推荐

  • 深入剖析智能仓储管理(WMS)应用价值与应用场景

    中国企业都在思考和部署如何实现一种高度自动化 高度信息化 高度网络化的生产模式 从而实现基于大数据的用户全息深层分析 本文目的在于交流如何建设适合自己企业的智能仓储 文 供应链指南针 孙亚博 2013年德国提出第四次工业革命 工业4 0的兴
  • linux开机自启动脚本以及update-rc.d命令解析

    linux有很多种自启动方式 这里只是简单记录下update rc d的自启动方式 update rc d的介绍 update rc d命令用于安装或移除System V风格的初始化脚本连接 脚本是存放在 etc init d 目录下的 我
  • HashSet详解

    概述 HashSet也是一个使用频率非常高的一个集合容器 最大的特点是存储的元素是没有重复的 而且是无序的 那么对于HashSet是如何判断原始是否重复 底层又是怎么实现的 你了解吗 HashSet介绍 HashSet 基于 HashMap
  • git-常见问题解决方法(全)

    git使用过程中遇到的问题解决方法记录 问题 1 更新代码后显示 unable to unlink old xxx xxx xx invalid argument 问题原因 要提交或更新的文件被系统线程占用 解决方法 把相关服务暂停 重新p
  • PDF文件如何转成markdown格式

    百度上根据pdf转makrdown为关键字进行搜索 结果大多数是反过来的转换 即markdown文本转PDF格式 但是PDF转markdown的解决方案很少 正好我工作上有这个需求 所以自己实现了一个解决方案 下图是一个用PDF XChan
  • 微前端的出现的背景和意义

    目录 微前端是什么 大规模 Web 应用的困局 传统 Web 应用的利与弊 背景和意义总结 微前端是什么 微前端是一种类似于微服务的架构 是一种由独立交付的多个前端应用组成整体的架构风格 将前端应用分解成一些更小 更简单的能够独立开发 测试
  • mysql删除一行_MySql删除表中一行的实操方法

    MySql删除表中一行的实操方法 首先你要确定能够唯一确定你那一行数据的字段或字段组合是哪些 DELETE FROM 表名 WHERE 字段1 and 字段2 and 字段1 为能够唯一确定某一行数据的字段组合 中填写你要 删除的字段具体值
  • Unity-ScrollRect-循环播放图片(确实没有转载是真的)

    都在代码和代码注释里了 发表在这里我还是有私心想要问问题的 是因为自己在使用时发现 Unity会调用两次通过继承来的PictureScrollView的Start函数两次 我并不能想明白是怎么回事 还请有了解的指点一下 先谢谢能给我指点的各
  • 【好文分享】亲试可行!简单快捷!如何在Ubuntu上编译Linux0.11

    2023年9月10日 周日上午 昨天晚上按照博客园的这篇文章试了一下 很快就成功在Ubuntu上编译运行了Linux0 11 https www cnblogs com chaoguo1234 p 16883932 html
  • linux redhat6.5 64位 login登陆无限循环

    场景 公司VC上虚机要迁移 通过拷贝vmfs文件方式迁移 开机后 发现无法登陆 一开始怀疑密码有问题 后来排除 然后网上搜索要修改 etc pam d login里边的参数 64位系统将 lib security pam limits so
  • Eclipse 报错: “Workspace in use or cannot be created, chose a different one.”

    打开eclipse报错 Workspace in use or cannot be created chose a different one 意识是 正在使用或无法创建工作区 选择另一个 解决办法 找到你eclipse得工作区 打开 me
  • C++ typeid运算符:获取类型信息

    typeid 运算符用来获取一个表达式的类型信息 类型信息对于编程语言非常重要 它描述了数据的各种属性 对于基本类型 int float 等C 内置类型 的数据 类型信息所包含的内容比较简单 主要是指数据的类型 对于类类型的数据 也就是对象
  • vue2和vue3 父子组件传参及区别

    vue3 1 父组件传子组件 在父组件的子组件标签中定义一个属性 在子组件中用defineProps接收父组件传来的值 父组件
  • python读取excle表中的数据

    没什么可介绍的 直接看代码 import pandas as pd from pandas import DataFrame if name main 读取excle表中的数据 file path r D ex Concrete Data
  • 从零搭建一个vue项目

    为了几个姐妹的需求 本文详细图解怎么样从零搭建一个vue项目 供参考 第一步 了解工具 首先我们需要一些工具 比如npm nodejs vue cli 和一个编译器vscode 也可以用别的 这里用vscode作为开发工具演示 第二步 检查
  • VMware虚拟机首次安装centos7.15后配置网络和关闭防火墙

    听了朋友的意见打算学下linux 学习当然是从安装开始了 网上找了个最新版的边看教程边装 网上看了好几个不同的教程 安装的时候还不难 都比较详细 但配置网络时都说的不太清楚 毕竟我没什么基础 如果不说清楚的话 很多地方我也不太懂 看了很多个
  • 编译内核的相关知识

    1 在PC端搭建环境 ubantu 2 树莓派等芯片带操作系统的启动过程 C51 STM32 裸机 用C直接操控底层寄存器实现相关业务 业务流程型的裸机代码 3 带有操作系统的 X86 intel windows 启动过程 电源 gt bi
  • openGL之API学习(三十)深度缓冲区深度值为负值

    通过 glReadPixels 0 0 WINDOW WIDTH WINDOW HEIGHT GL DEPTH COMPONENT GL UNSIGNED BYTE tmpPixelsBuffer 从帧缓冲区中读取深度信息 深度值竟然是负值
  • 插入排序 Insertion Sort

    插入排序 Insertion Sort 基本概念 插入排序的实现 时间复杂度和空间复杂度 稳定性 基本概念 从 index 1开始 不断将元素插入右边已经排好序的数组 适用于少量元素 Example 9 2 1 4 3 Step 1 9 2
  • 理解分组卷积与深度可分离卷积

    这两种卷积分别是在ResNext论文与MobileNet系列中体现的 貌似Xception中也有深度可分离卷积的体现 作用都很简单 为了降参 目录 1 分组卷积 group convolution 2 深度可分离卷积 depthwise s