DGC:真动态分组卷积,可能是解决分组特征阻塞的最好方案 | ECCV 2020 Spotlight
近期,动态网络在加速推理这方面有很多研究,DGC(Dynamic Group Convolution)将动态网络的思想结合到分组卷积中,使得分组卷积在轻量化的同时能够加强表达能力,整体思路直接清晰,可作为网络设计时的一个不错的选择
来源:晓飞的算法工程笔记 公众号
论文: Dynamic Group Convolution for Accelerating Convolutional Neural Networks

Introduction
分组卷积目前广泛应用于轻量级网络中,但论文分析发现分组卷积有两个致命的缺点:
- 由于引入稀疏连接,减弱了卷积的表达能力,导致性能的降低,特别对于难样本。

- 固定的连接模式,不会根据输入样本的特性而改变。而论文通过可视化DenseNet中间层的输入维度对输出维度的贡献发现,不同的输入维度对不同的输出的贡献是不一样的,而且这个贡献关系在不同的输入样本之间也存在差异。
参考动态网络的思想,论文提出动态分组卷积(DGC, dynamic group convolution),为每个分组引入小型特征选择器,根据输入特征的强度动态决定连接哪些输入维度,而多个分组能捕获输入图片中不同的互补特征,学习到丰富的特征表达能力。为此,动态分组卷积能够在保持原网络的完整结构下,自适应地为每个分组的选择最相关输入维度。
Group-wise Dynamic Execution

DGC的结构如图2所示,将输出维度分成多个分组,每组都配有辅助head,用来决定那些输入维度用于卷积计算。每个分组的逻辑如下:
- saliency generator生成输入维度的重要性分数。
- input channel selector采用gating策略根据重要性评分来动态决定输入维度最重要部分。
- 对选择的输入维度子集进行正常的卷积操作。
最后,将所有head的输出concate并打乱,送入后续的BN层和激活层。
Saliency Generator
saliency generator为每个输入维度指定一个分数用来表示其重要程度,每个head都有特定的saliency generator,用来引导不同的head使用不同的输入维度,从而增加特征的多样化表达。saliency generator遵循了SE block的设计,对于第\(i\)个head,重要性向量\(g^i\)的计算为:

\(g^i\in \mathbb{R}^{1\times C}\)代表输入维度的重要性向量,\((z)_+\)代表ReLU激活,\(p\)将每个输入特征图缩小为单个标量,论文采用使用全局平均池化,\(\beta^{i}\)和\(W^{i}\)为可学习参数,\(\beta^{i}\)为偏置,\(W^{i}\)两部转换操作\(\mathbb{R}^{1\times C}\mapsto \mathbb{R}^{1\times C/d}\mapsto \mathbb{R}^{1\times C}\),其中d为压缩比。这里的\(x^{i}\)为全部输入维度,即在每个head中,所有的输入维度都是候选。
Gating Strategy
在获得重要性向量后,下一步是决定当前head选择哪些输入维度参与后续的卷积操作,可以用head-wise阈值或network-wise阈值来过滤分数较低的输入特征。论文使用的是head-wise阈值,给定目标裁剪比例\(\zeta\),第\(i\)个head的阈值\(\tau^{i}\)满足:

重要性分数有两个作用:1) 重要性分数小于阈值的将被去除 2) 剩余的维度会使用对应的重要性分数进行加权,得到加权特征\(y^{i}\in \mathbb{R}^{(1-\zeta)C\times H\times W}\)。假设head数量为\(\mathcal{H}\),第\(i\)个head的卷积核为\(w^{i}\subset \theta^{i}, \theta^{i} \in \mathbb{R}^{k\times k\times C\times \frac{C^{'}}{\mathcal{H}}}\),则对应的卷积计算为:

公式7其实就是将选择的特征和对应的权值选出来进行常规卷积计算,\(\mathcal{I}_{top} \lceil k\rceil (z)\)返回\(z\)中最大的\(k\)个元素的下标,输出\(x^{'i}\in \mathbb{R}^{\frac{C^{'}}{\mathcal{H}}\times H^{'}\times W^{'}}\),\(\otimes\)为常规卷积。在DGC的最后,各输出会合并然后打乱,输出\(x^{'}\)。
为了让重要性分数尽量稀疏,引入lasso损失:

\(\mathcal{L}\)为DGC层数,\(\lambda\)为预设的超参数。
Computation Cost
卷积核大小为\(k\)的常规卷积MAC为\(k^2C^{'}CH^{'}W^{'}\),而DGC中,每个head的saliency generator和卷积的MAC为\(\frac{2C^2}{d}\)和\(k^2(1-\zeta)C\frac{C^{'}}{\mathcal{H}}H^{'}W^{'}\)。所以DGC层的MAC相对于常规卷积的节省比例为:

head的数量\(\mathcal{H}\)几乎对整体的计算消耗没有影响。
Invariant to Scaling

DGC方法整体思想与动态剪枝算法FBS有点类似,FBS算法的流程如上图所示,计算的是输出维度的重要性分数,在最后的特征输出时使用重要性分数进行了加权,没有采用BN。这种加权方式会导致每个样本的特征分布差异较大,造成internal covariate shift问题。
而DGC虽然也使用重要性分数进行特征加权,但其对最后的卷积结果进行BN+ReLU归一化来避免这个问题:

Training DGC Networks

DGC网络从零开始训练,不需要预训练模型。在反向传播阶段,仅计算推理时选择的维度的相关权值的梯度,其它设为零。为了防止剪枝导致训练损失变化过大,在训练过程逐步增加裁剪比例\(\zeta\)。整体训练分为3个阶段,第一阶段(前1/12 epochs)用于warm up,第二阶段逐步提升剪裁比例进行训练,第三阶段(后1/4 epochs)用于fine-tune稀疏网络,学习率下降采用余弦退火下降方法。
Experiments

与剪枝方法和动态维度选择方法对比,DGC-G使用network-wise阈值进行维度选择,这个阈值是在训练中学习来的。

与其它轻量级网络对比。

不同参数设置的性能对比。

可视化浅层和深层的重要性分数和过滤情况。

DGC网络某层的其中一个head对于各输入维度的裁剪概率。
Conclustion
DGC(Dynamic Group Convolution)将动态网络的思想结合到分组卷积中,使得分组卷积在轻量化的同时能够加强表达能力,整体思路直接清晰,可作为网络设计时的一个不错的选择。
如果本文对你有帮助,麻烦点个赞或在看呗~
更多内容请关注 微信公众号【晓飞的算法工程笔记】

DGC:真动态分组卷积,可能是解决分组特征阻塞的最好方案 | ECCV 2020 Spotlight的更多相关文章
- CondenseNet:可学习分组卷积,原作对DenseNet的轻量化改造 | CVPR 2018
CondenseNet特点在于可学习分组卷积的提出,结合训练过程进行剪枝,不仅能准确地剪枝,还能继续训练,使网络权重更平滑,是个很不错的工作 来源:晓飞的算法工程笔记 公众号 论文:Neural ...
- Java_java动态编译整个项目,解决jar包找不到问题
java动态编译整个项目,解决jar包找不到问题原文:http://itzyx.com/index.php/javac/ 动态将java文件编译为class文件解决方案:将temp\sdl\src目录 ...
- 使用jquery的load方法设计动态加载,并解决浏览器前进、后退、刷新等问题
继上一篇 使用jquery的load方法设计动态加载,并解决被加载页面JavaScript失效问题 解决了后台业务系统的部分动态加载问题,然而该框架离正常的用户体验还存在一些问题,如:浏览器的前进.后 ...
- Group Convolution分组卷积,以及Depthwise Convolution和Global Depthwise Convolution
目录 写在前面 Convolution VS Group Convolution Group Convolution的用途 参考 博客:blog.shinelee.me | 博客园 | CSDN 写在 ...
- 分组卷积+squeezenet+mobilenet+shufflenet的参数及运算量计算
来一发普通的二维卷积 1.输入feature map的格式为:m * m * h1 2.卷积核为 k * k 3.输出feature map的格式为: n * n * h2 参数量:k * k * h ...
- php面试题二--解决网站大流量高并发方案(从url到硬盘来解决高并发方案总结)
php面试题二--解决网站大流量高并发方案(从url到硬盘来解决高并发方案总结) 一.总结 从外到内解决网站大流量高并发问题---从提交一个url开始(从用户按下搜索栏回车键开始) url最开始会到d ...
- SEPC:使用3D卷积从FPN中提取尺度不变特征,涨点神器 | CVPR 2020
论文提出PConv为对特征金字塔进行3D卷积,配合特定的iBN进行正则化,能够有效地融合尺度间的内在关系,另外,论文提出SEPC,使用可变形卷积来适应实际特征间对应的不规律性,保持尺度均衡.PConv ...
- 微信分组群发45028,微信分组群发has no masssend quota hint
微信分组群发45028,微信分组群发has no masssend quota hint >>>>>>>>>>>>>> ...
- echarts解决一些大屏图形配置方案汇总
本文主要记录使用echarts解决各种大屏图形配置方案. 1.说在前面 去年经常使用echarts解决一些可视化大屏项目,一直想记录下使用经验,便于日后快速实现.正好最近在整理文档,顺道一起记录在博客 ...
- Python中正则匹配使用findall,捕获分组(xxx)和非捕获分组(?:xxx)的差异
转自:https://blog.csdn.net/qq_42739440/article/details/81117919 下面是我在用findall匹配字符串时遇到的一个坑,分享出来供大家跳坑. 例 ...
随机推荐
- U盘安装win7提示缺少所需的CD/DVD驱动器设备驱动程序
问题: 最近使用U盘启动盘安装win7,系统弹出提示框: 解决方法: U盘别插在usb3.0的口(蓝色),换成一个usb2.0的口就可以了
- WinRT: 可能是 Windows 上最好用的 Native ABI 和远程调用方案
前言 Windows 自从很久以来就有一个叫做 COM 的 Native ABI.这是一套面向对象的 ABI,在此之上 Windows 基于 COM ABI 暴露了各种各样的 API,例如 Manag ...
- 在Windows10中安装解压版MySQL 8.X
在Windows 10中安装解压版的MySQL 8.X实现步骤: 1.下载MySQL安装包:https://dev.mysql.com/downloads/mysql/ 解压到指定目录,比如:D:\o ...
- xadmin后台的安装及配置使用
安装 pip install https://codeload.github.com/sshwsfc/xadmin/zip/django2 在settings.py中注册如下应用 INSTALLED_ ...
- 记一个 Duplicate class kotlin-stblib vs kotlin-stdlib-jdk7/8 编译问题引发的案例
某天将项目 kotlin 版本升级到了 1.8.0 ,然后编译报错了, Duplicate class kotlin-stblib vs kotlin-stdlib-jdk7/8 然后开始寻求解决方案 ...
- 2.Go 的指针
Go的指针 1. 变量内存地址 var age = 18 // & + 变量 = 变量内存地址 fmt.Println("age:",&age) 2. 指针变量 / ...
- 【Azure Logic App】在Logic App中使用 Transfer XML组件遇见错误 undefined
问题描述 在Azure Logic App中,使用Transform XML组件进行XML内容的转换,但是最近这个组件运行始终失败. 问题解答 点击Transform XML组件上的错误案例,并不能查 ...
- 【Azure 应用服务】App Service 的.NET Version选择为.NET6,是否可以同时支持运行ASP.NET V4.8的应用呢?
问题描述 App Service 的.NET Version选择为.NET6,是否可以同时支持运行ASP.NET V4.8的应用呢? 问题解答 答案是可以的,Azure App Service .NE ...
- 【Azure Redis 缓存】Redis导出数据文件变小 / 在新的Redis复原后数据大小压缩近一倍问题分析
问题描述 使用 Azure Cache for Redis 服务,在两个Redis服务之间进行数据导入和导出测试.在Redis中原本有7G的数据值,但是导出时候发现文件大小仅仅只有30MB左右,这个压 ...
- consul 的 HTTP API 和使用方法
目录 搭建起 consul Consul 的 HTTP API Service API 简单地注册服务 健康检查的配置和查询 建议读者先学习笔者的另一篇文章 学习搭建 Consul 服务发现与服务网格 ...