CondenseNet:可学习分组卷积,原作对DenseNet的轻量化改造 | CVPR 2018
CondenseNet特点在于可学习分组卷积的提出,结合训练过程进行剪枝,不仅能准确地剪枝,还能继续训练,使网络权重更平滑,是个很不错的工作
来源:晓飞的算法工程笔记 公众号
论文:Neural Architecture Search with Reinforcement Learning

Introduction

DenseNet基于特征复用,能够达到很好的性能,但是论文认为其内在连接存在很多冗余,早期的特征不需要复用到较后的层。为此,论文基于可学习分组卷积提出CondenseNet,能够在训练阶段自动稀疏网络结构,选择最优的输入输出连接模式,并在最后将其转换成常规的分组卷积分组卷积结构。
CondenseNets

分组卷积能够有效地降低网络参数,对于稠密的网络结构而言,可以将$3\times 3$卷积变为$3\times 3$分组卷积。然而,若将$1\times 1$卷积变为$1\times 1$分组卷积,则会造成性能的大幅下降,主要由于$1\times 1$卷积的输入一般有其内在的联系,并且输入有较大的多样性,不能这样硬性地人为分组。随机打乱能够一定程度地缓解性能的降低,但从实验来看还不如参数较少的DenseNet。
另外,论文认为稠密连接虽然有利于特征复用,但是存在较大的冗余性,但很难定义哪个特征对当前层是有用的。为此,论文引入了可学习的分组卷积来解决上述问题。
Learned Group Convolution

分组卷积的学习包含多个阶段,如图3和图4所示,前半段训练过程包含多个condensing阶段,结合引导稀疏化的正则化方法来反复训练网络,然后将不重要的filter剪枝。后半部分为optimization阶段,这个阶段对剪枝固定后的网络进行学习。实现细节如下:
- Filter Groups,卷积分组
将标准卷积进行分组,比如$1\times 1$卷积的核大小为$O\times R$矩阵$\mathbb{F}$,将该卷积核分为$G$组,标记为$\mathbb{F}1,\mathbb{F}2,\cdots,\mathbb{F}G$,每个$\mathbb{F}g$大小为$\frac{O}{G}\times R$,$\mathbb{F}_{i,j}^g$代表$g$组内处理$i$输入和$j$输出的卷积核,注意这里没有对输入进行对应的分组。
- Condensation Criterion,压缩标准
在训练的过程逐步剔除每个组中权重较低的输入特征子集,$i$输入特征对于$g$组的重要程度通过求和组内所有对应的权值获得${\sum}{i=1}^{O/G} |\mathbb{F}{i,j}g|$,将$\mathbb{F}g$中重要程度较小的输入特征对应的列置为零,从而将卷积层稀疏化。
- Group Lasso
一般而言,为了减少剪枝带来的准确率影响,可以通过使用L1正则方法引导权值尽量稀疏。由于分组卷积的特性,CondenseNets需要更严格的列稀疏来引导组内的卷积尽量使用相同的输入子集,因此采用group级别的稀疏性,论文提出group-lasso正则化:

根号内的项由列中最大的元素主宰,group-lasso能够引导稀疏的$F^g$列趋向完全为0。
- Condensation Factor
可学习分组卷积不仅能够自动发现最优的输入输出连接模式,而且更灵活。组内使用的输入特征数不一定为$\frac{1}{G}$倍,而是根据定义condensation factor $C$(不一定等于$G$),允许每组选择$\lfloor \frac{R}{C} \rfloor$个输入。
- Condensation Procedure
CondenseNet的剪枝在训练过程中进行,如图3所示,在每个$C-1$condensing阶段,会剪除$\frac{1}{C}$权重,在训练的最后,仅保留每个卷积组内的$\frac{1}{C}$权重。每个condensing阶段的训练周期设为$\frac{M}{2(C-1)}$,$M$为总的训练周期,所有condensing阶段共占训练的一半。
需要注意,训练阶段并没有真正地将权重去除,而是使用二值tensor作为掩膜进行element-wise相乘,这样的实现在GPU上仍是高效的,不会带来太多额外的耗时。
- Learning rate

训练使用cosine学习率退火,训练过程如图4所示,中间的损失突然上升是由于最后的condensing阶段后剪枝了一半的权重(最后的condensing阶段内仅$\frac{2}{C}$权重)导致的,但从图中可以看出,训练很快就恢复了。
- Index Layer
在训练后,需要去除剪枝的权重转换为常规的网络结构,这样不仅能够降低网络参数,还能保证在计算能耗有限的设备上高效运行。为此CondenseNet在发布时需要加入Index层,该层的原理如图3最右所示,根据剪枝后的剩余权重对输入特征进行重排,将可学习分组卷积的剩余权重转换成分组卷积,训练阶段到测试阶段的转换如图1。
需要注意,论文对$1\times 1$分组卷积的输出进行了重排,这样做的原因是为了让后面的分组卷积能够地使用到前面分组卷积提取的属性。
Architecture Design

除了可学习分组卷积,论文还对原来的DenseNet结构进行了修改,如图5所示,共包含两点修改:
- Exponentially increasing growth rate(IGR),Densenet每层增加$k$个新的特征图,$k$称为增长率。而论文发现越深的层实际更依赖较高维的特征,因此需要增强与当前层较近的特征连接,通过逐渐增加增长率来实现。设置增长率为$k=2^{m-1}k_0$,$m$为dense block下标,$k_0$为常数,这样能够增加较后层输出的特征的占比。
- Fully dense connectivity(FDC),为了更多的特征重用,将所有的层进行了连接,并为不同的层提供了不同的下采样操作。
Experiments

验证论文提出的改进方法的效果。

CIFAR-10上的轻量级网络性能对比。

CIFAR-10和CIFAR-100上的剪枝SOTA网络性能对比。


ImageNet上的轻量级网络性能对比。

ImageNet上的SOTA网络推理耗时对比。

对不同超参进行了对比实验。
CONCLUSION
CondenseNet特点在于可学习分组卷积的提出,整体的结构设计十分巧妙。以往的剪枝工作都是在网络训练后进行的,导致精度有较大的下降,而可学习分组卷积结合训练过程进行剪枝,不仅能准确地剪枝,还能继续训练,使网络权重更平滑,是个很不错的工作。
如果本文对你有帮助,麻烦点个赞或在看呗~
更多内容请关注 微信公众号【晓飞的算法工程笔记】

CondenseNet:可学习分组卷积,原作对DenseNet的轻量化改造 | CVPR 2018的更多相关文章
- 卷积神经网络学习笔记——轻量化网络MobileNet系列(V1,V2,V3)
完整代码及其数据,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/DeepLearningNote 这里结合网络的资料和Mo ...
- Group Convolution分组卷积,以及Depthwise Convolution和Global Depthwise Convolution
目录 写在前面 Convolution VS Group Convolution Group Convolution的用途 参考 博客:blog.shinelee.me | 博客园 | CSDN 写在 ...
- 深度学习之卷积神经网络(CNN)
卷积神经网络(CNN)因为在图像识别任务中大放异彩,而广为人知,近几年卷积神经网络在文本处理中也有了比较好的应用.我用TextCnn来做文本分类的任务,相比TextRnn,训练速度要快非常多,准确性也 ...
- 深度学习之卷积神经网络(CNN)的应用-验证码的生成与识别
验证码的生成与识别 本文系作者原创,转载请注明出处:https://www.cnblogs.com/further-further-further/p/10755361.html 目录 1.验证码的制 ...
- 深度学习之卷积神经网络CNN及tensorflow代码实例
深度学习之卷积神经网络CNN及tensorflow代码实例 什么是卷积? 卷积的定义 从数学上讲,卷积就是一种运算,是我们学习高等数学之后,新接触的一种运算,因为涉及到积分.级数,所以看起来觉得很复杂 ...
- 分组卷积+squeezenet+mobilenet+shufflenet的参数及运算量计算
来一发普通的二维卷积 1.输入feature map的格式为:m * m * h1 2.卷积核为 k * k 3.输出feature map的格式为: n * n * h2 参数量:k * k * h ...
- 深度学习之卷积神经网络CNN及tensorflow代码实现示例
深度学习之卷积神经网络CNN及tensorflow代码实现示例 2017年05月01日 13:28:21 cxmscb 阅读数 151413更多 分类专栏: 机器学习 深度学习 机器学习 版权声明 ...
- 【神经网络与深度学习】卷积神经网络(CNN)
[神经网络与深度学习]卷积神经网络(CNN) 标签:[神经网络与深度学习] 实际上前面已经发布过一次,但是这次重新复习了一下,决定再发博一次. 说明:以后的总结,还应该以我的认识进行总结,这样比较符合 ...
- JUC源码学习笔记4——原子类,CAS,Volatile内存屏障,缓存伪共享与UnSafe相关方法
JUC源码学习笔记4--原子类,CAS,Volatile内存屏障,缓存伪共享与UnSafe相关方法 volatile的原理和内存屏障参考<Java并发编程的艺术> 原子类源码基于JDK8 ...
随机推荐
- 通过el-tree 实现每次可选中一个节点方案(非checkbox)
<el-tree v-if="orgDrawer" :data="orgTree" size="medium" ref="o ...
- 重识Java8函数式编程
前言 最近真的是太忙忙忙忙忙了,很久没有更新文章了.最近工作中看到了几段关于函数式编程的代码,但是有点费解,于是就准备总结一下函数式编程.很多东西很简单,但是如果不总结,可能会被它的各种变体所困扰.接 ...
- java 虚拟机指令重新排序
指令重排序是JVM为了优化指令,提高程序运行效率,在不影响单线程程序执行结果的前提下,尽可能地提高并行度.编译器.处理器也遵循这样一个目标.注意是单线程.多线程的情况下指令重排序就会给程序员带来问题. ...
- centos搭建nginx+fastdfs
软件地址 libfastcommon fastDFS fastdfs-nginx-module nginx 创建目录 mkdir -p /fastdfs/tracker mkdir -p /fastd ...
- 测试同学动手搭个简易web开发项目
技术栈 node.js, vue.js, axios, python, django, orm, restful api, djangorestframework, mysql, nginx, jen ...
- 关于对Entity Framework 3.1的理解与总结
Entity Framework Core 是一个ORM,所谓ORM也是ef的一个框架之一吧,简单的说就是把C#一个类,映射到数据库的一个表,把类里面的属性映射到表中的字段.然后Entity Fram ...
- postman使用小结(一)
postman可以用来做接口测试. 下面是使用的基本步骤: 1新建http请求: 2设置请求类型get/post/put/delete...: 3设置请求的url: 4设置请求的Header头部信息, ...
- Docker(五)Docker镜像讲解
Docker镜像讲解 镜像概念 镜像是一种轻量级.可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码.运行时.库.环境变量和配置文件 Dock ...
- 入门大数据---Kafka消费者详解
一.消费者和消费者群组 在 Kafka 中,消费者通常是消费者群组的一部分,多个消费者群组共同读取同一个主题时,彼此之间互不影响.Kafka 之所以要引入消费者群组这个概念是因为 Kafka 消费者经 ...
- 隐藏input的三种方法和区别
一.<input type="hidden" />二.<input type="text" style="display:none& ...