1. 摘要

作者提出了一个前所未有高效的新奇网络结构,称之为 CondenseNet,该结构结合了密集连接性和可学习的分组卷积模块。

密集连接性有利于网络中的特征复用,而可学习的分组卷积模块则可以移除多余的特征复用之间的连接。在测试的时候,训练好的模型可以使用标准的分组卷积来实现,在实际中计算非常高效。

2. 介绍和相关工作

深度学习模型一般都是在多个 GPU 上进行训练,然后再在计算资源有限的移动设备上进行部署。因此,一个好的网络结构应该允许训练阶段可以快速并行,而在测试的时候可以压缩。

一层一层堆叠卷积层的结构会使得网络需要通过学习来复制前面层的特征,而 DenseNet 通过直接将前面层的特征连接到后面的层来产生特征复用。尽管这很高效,但其实会产生一些冗余,也就是前面的一些特征在后面并不需要。因此,作者提出了一个方法来在训练阶段对这些多余的连接进行剪除,而在测试阶段则可以高效地通过分组卷积来实现。具体来说,作者将一层网络的卷积核分为几个组,然后逐渐移除每个组内不重要特征之间的连接。更重要的是,这些组不是预先定义好的,而是网络自己学出来的。

相较于以前的权重剪枝和量化,CondenseNet 有两个不同的地方:它是在训练的早期阶段进行剪枝的,这比在整个过程中使用 L1 正则化更加高效;训练好的 CondenseNet 具有更高的稀疏度,然而依旧可以产生高效的分组卷积。

标准的卷积层通过应用一个卷积核到所有的 \(R\) 个输入特征图来得到一个输出特征图,而分组卷积则将输入特征图分为 \(G\) 个组,一个输出特征图只与一个组内的输入特征图有关。

3. CondenseNet

下图左边为 DenseNet 中的一层,我们可以将分组卷积应用到 3×3 的卷积层,但是实验发现如果简单地将分组卷积应用到 1×1 的卷积层会导致准确率有很大的降低。输入到 1×1 卷积层的特征是上一层输出特征的拼接,它们有一个内在的顺序而且是非常多样化的,所以直接硬分组对特征复用是不利的。

因此,作者提出了一个方法,让网络在训练阶段自己学习对输入特征自动分组,让每个组的卷积核自己选取最相关的输入特征。而且,允许一个输入特征被多个组共享,也允许一个输入特征被所有组都忽略。

3.1. 可学习的分组卷积

分组卷积是通过多个阶段学习到的,如下图所示。训练的前一半迭代过程由 condensing 阶段组成的,我们重复地训练网络来修剪掉权值比较小的不重要卷积核,也就是针对某些输入特征的权重置为零。训练的后一半是优化阶段,我们固定学习到的分组卷积来学习卷积核参数。当进行剪枝的时候,我们确保同一组的稀疏模式相同,也就是同一个组的输入特征图是一样的。这样,在测试阶段,稀疏化的层就可以通过标准的分组卷积来实现,这可以大大地降低计算代价。

针对 1×1 的卷积,卷积核大小为 \(O×1×1×R\) 的矩阵 \(F\),\(O\) 是输出通道数,\(R\) 是输入通道数。在训练之前,我们将卷积核或者说是输出特征分为 \(G\) 个大小相同的组,每个组的卷积核表示为 \(F^1, \cdots, F^G\) ,每个 \(F^g\) 大小为 \(\frac{O}{G}×R\),\(F^g_{ij}\) 代表负责从第 j 个输入产生第 i 个输出的权重。

那么,第 j 个输入对当前分组内输出特征的重要性可以通过某一列权重的平均绝对值来表示,也即 \(\textstyle \sum^{O/G}_{i=1}|F^g_{ij}|\)。也就是说,我们移除 \(F^g\) 中的某一列(将这一列置为零),如果这一列的 \(L_1\) 范数比其它列的都小,实际上也就是第 j 个输入对当前组的输出特征不那么重要。这也就产生了结构上的稀疏性:同一个组内的卷积核接受同样的输入特征。

为了减少权重剪枝对网络的准确性带来的负面影响,通常使用 \(L_1\) 正则化来产生稀疏性。针对 CondenseNet ,作者提出了一个组级别(group-level)的稀疏性,来在训练过程中加上一个正则项,这个正则项会让 \(F^g\) 中的某一列元素趋向于零。

在实际中,一个组内使用的输入特征比例不一定要是 \(1/G\),作者定义了一个 condensation 因子 $C $,每个分组卷积的输入特征数目为 \(\lfloor \frac{R}{C}\rfloor\)。

在训练阶段,每个组的卷积核最后只会有 \(1/C\) 得以保留,所以我们有 \(C-1\) 个 condensing 阶段,在每个阶段的最后面,我们修剪掉 \(1/C\) 的权重。修剪的操作是通过一个 mask 来实现的,那些修剪掉的权重在 mask 中对应的元素为 0 ,然后通过 mask 与权重进行一个逐元素的相乘,这样可以在 GPU 上高效地实现。作者在实验中设置每个 condensing 阶段的 \(epochs=\frac{M}{2(C-1)}\),这样总训练次数的前一半就用来产生稀疏的分组卷积。

作者采用余弦形状的学习率,一个训练过程中的损失函数和学习率变化情况如下图所示。迭代次数为 150 时损失函数的突然上升是因为移除了余下权重的一半,但是模型可以在优化阶段又逐渐恢复。

在测试阶段,我们需要一个 index layer 来对输入特征图进行一个选择和重新排序,从而使得分组卷积能够实现,如上图 3 右边所示。

3.2. 网络结构

作者对 DenseNet 做了两个改变,来更简化网络结构改进计算效率。

  • 指数增加的增长率

在原来的 DenseNet 中,每一层会产生 \(k\) 个特征图,\(k\) 是一个常数称之为增长率。网络中更深的层会更依赖一些高层信息,因此我们应该使得更近的特征图之间有更多的连接,也就是来自靠后面层特征的比例应该比来自更早层特征的比例多一些。作者设置更深的层增长率更大,\(k=2^{m-1}k_0\),其中 \(m\) 代表第几个密集块,\(k_0\) 是一个常数。

  • 全密集连接

为了更加鼓励特征复用,作者连接输入层到其后面的所有层,甚至是不同块的也进行连接。如果特征图的空间大小不一样,则对分辨率较大的特征图进行平均池化下采样。

另外,可学习的分组卷积只应用在每一个基本层的第一个 1×1 卷积上,然后会进行一个通道打乱操作,让特征图均匀分布在每一个组中,紧接着的 3×3 卷积是一个标准的分组卷积。

4. 实验结果

在 DenseNet 的基础上引入可学习的分组卷积后,测试误差大大降低,然后再加上指数级增加的增长率策略,模型的表现还可以进一步提高。

在 CIFAR 和 ImageNet 数据集上的表现分别如下所示。

分组卷积的组数和 condensation 因子的对比试验如下所示。

获取更多精彩,请关注「seniusen」!

CondenseNet: An Efficient DenseNet using Learned Group Convolutions的更多相关文章

  1. 论文笔记-IGCV3:Interleaved Low-Rank Group Convolutions for Efficient Deep Neural Networks

    论文笔记-IGCV3:Interleaved Low-Rank Group Convolutions for Efficient Deep Neural Networks 2018年07月11日 14 ...

  2. IGC(Interleaved Group Convolutions)

    深度学习被引起关注是在2012年,用神经网络训练的一个分类模型在ImagNet上取得了第一名,而且其分类精度比第二名高出10多个点,当时所使用的模型为AlexNet,现在看来其为一个比较简单的网络,而 ...

  3. CondenseNet:可学习分组卷积,原作对DenseNet的轻量化改造 | CVPR 2018

    CondenseNet特点在于可学习分组卷积的提出,结合训练过程进行剪枝,不仅能准确地剪枝,还能继续训练,使网络权重更平滑,是个很不错的工作   来源:晓飞的算法工程笔记 公众号 论文:Neural ...

  4. Group Convolution分组卷积,以及Depthwise Convolution和Global Depthwise Convolution

    目录 写在前面 Convolution VS Group Convolution Group Convolution的用途 参考 博客:blog.shinelee.me | 博客园 | CSDN 写在 ...

  5. MySQL如何优化GROUP BY :松散索引扫描 VS 紧凑索引扫描

    执行GROUP BY子句的最一般的方法:先扫描整个表,然后创建一个新的临时表,表中每个组的所有行应为连续的,最后使用该临时表来找到组 并应用聚集函数.在某些情况中,MySQL通过访问索引就可以得到结果 ...

  6. ICCV 2017论文分析(文本分析)标题词频分析 这算不算大数据 第一步:数据清洗(删除作者和无用的页码)

    IEEE International Conference on Computer Vision, ICCV 2017, Venice, Italy, October 22-29, 2017. IEE ...

  7. AI:IPPR的数学表示-CNN稀疏结构进化(Mobile、xception、Shuffle、SE、Dilated、Deformable)

    接上一篇:AI:IPPR的数学表示-CNN基础结构进化(Alex.ZF.Inception.Res.InceptionRes). 抄自于各个博客,有大量修改,如有疑问,请移步各个原文.....  前言 ...

  8. 深度学习笔记(十一)网络 Inception, Xception, MobileNet, ShuffeNet, ResNeXt, SqueezeNet, EfficientNet, MixConv

    1. Abstract 本文旨在简单介绍下各种轻量级网络,纳尼?!好吧,不限于轻量级 2. Introduction 2.1 Inception 在最初的版本 Inception/GoogleNet, ...

  9. ShuffleNetV1/V2简述 | 轻量级网络

    ShuffleNet系列是轻量级网络中很重要的一个系列,ShuffleNetV1提出了channel shuffle操作,使得网络可以尽情地使用分组卷积来加速,而ShuffleNetV2则推倒V1的大 ...

随机推荐

  1. Django 使用request获取浏览器发送的参数(Django编程-5)

    1.url:需要正则去匹配 url(r'^index/(num)/$',view.index) 匹配到的参数会自动传入对应的视图函数 也可以给匹配到的参数起名字?P url(r'^index/(?P& ...

  2. Ubuntu中用bitbake core-image-minimal时,出错:from bb import data

    问题描述: 在准备ARM交叉编译环境时,执行完命令: DISTRO=fsl-imx-x11 MACHINE=imx6qsabresd source fsl-setup-release.sh -b bu ...

  3. 月薪 30K Java 程序员,需要掌握哪些技术?

    转载自:Java3y 1-5年的Java程序员,薪资区间大致是在15-25K左右,那有没有可能提前达到30K的薪资呢?有人说这只能是大企业或者互联网企业工程师才能拿到.也许是的,小公司或者非互联网企业 ...

  4. mongo启动报错问题处理

    关键错误信息child process failed, exited with error number 100 这是服务器断电导致数据库意外关闭导致的问题,处理方法也比较简单 rm -rf /var ...

  5. trigger添加及表达式

    创建触发器 点击Configuration(配置) → Hosts(主机) 点击hosts(主机)相关行的trigger 点击右上角的创建触发器(create trigger) name : 触发器名 ...

  6. STL源码阅读-functor与adapter

    为什么要用仿函数 函数指针不灵活,难以与STL其他组件配合使用 Adapter 将一个class的接口转换为另一个class的接口,使原本因接口不兼容而不能合作的classes,可以一起运作 STL中 ...

  7. Sql service 分页存储过程

    create database Exam_Week3 GO USE Exam_Week3 GO create table Classs ( ClaID ,), ClassName ), Counts ...

  8. 如何优雅高效的写博客(Sublime + Markdown + Evernote)

    如何优雅高效的写博客(Sublime + Markdown + Evernote) 本文主要是参照了几位大神的博客加上自己捣鼓了半天,比较适合新手流畅阅读 非常感谢下面两位大神: @dc_726: h ...

  9. php的工作原理

    php有一种专门解释php的引擎称之为zend引擎 对于源程序,php引擎全部读入,而后进行词法分析,如果遇到不认识的词,就报parse_error (词法错误后终止分析) 词法分析后进入语法分析:语 ...

  10. Python 面向对象Ⅱ

    创建实例对象 实例化类其他编程语言中一http://www.xuanhe.net/般用关键字 new,但是在 Python 中并没有这个关键字,类的实例化类似函数调用方式. 以下使用类的名称 Empl ...