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. Python多线程异步任务队列

    原文地址 python的多线程异步常用到queue和threading模块 #!/usr/bin/env python # -*- coding: UTF-8 -*- import logging i ...

  2. Docker架构及其三要素

    1.Docker架构 a.Docker客户端和服务端   Docker是客户-服务器(C/S)架构的程序.Docker客户端只需向Docker服务器或守护进程发出请求,服务器或守护进程将完成所有工作并 ...

  3. shell判断文件,目录是否存在或者具有权限

    shell判断文件,目录是否存在或者具有权限  #!/bin/sh  myPath="/var/log/httpd/"  myFile="/var /log/httpd/ ...

  4. python、第七篇:ORM框架SQLAlchemy

    一 介绍 SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取 ...

  5. java将一数组乱序排列

    JAVA的Collections类中shuffle方法模拟了“洗牌”动作可以对list列表进行随机排序.如果一定要自己写,算法也很简单:假设数组array长度为n.用标准随机函数rand(n)生成[0 ...

  6. BZOJ1233 [Usaco2009Open]干草堆tower[贪心+单调队列优化]

    地址 注意思路!多看几遍! 很巧妙的一道题.不再是决策点以dp值中一部分含j项为维护对象,而是通过维护条件来获取决策. 首先有个贪心策略,让底层的宽度尽可能小,才能让高度尽可能高.所以应该倒着dp,表 ...

  7. 【Linux学习四】Linux下Vim命令操作

    1.Vim介绍 Vim是一个类似于Vi的著名的功能强大.高度可定制的文本编辑器,在Vi的基础上改进和增加了很多特性. 第一阶段通过vimtutor的学习,加强vim的熟练度 1.1光标移动 hjkl左 ...

  8. 【Python数据分析】用户通话行为分析

    主要工作: 1.对从网上营业厅拿到的用户数据.xls文件,通过Python的xlrd进行解析,计算用户的主叫被叫次数,通话时间,通话时段. 2.使用matplotlib画图包,将分析的结果直观的绘制出 ...

  9. Python语法汇总

    如果你之前学过任何一门编程语言,因为每种语言的基础语法要做的事情其实基本是相同的,只是表示方式或某些地方稍稍不同,因此在学Python的时候将它与其它你已经掌握的编程语言对比着学,这样学起来更快,效果 ...

  10. 【leetcode】1012. Numbers With Repeated Digits

    题目如下: Given a positive integer N, return the number of positive integers less than or equal to N tha ...