1711_CondenseNet

图:

网络描述:

CondenseNet是作者在DenseNet基础上进行改进,集合了分组卷积、稠密连接、剪枝等。
实验证明,CondenseNet比前沿的MobileNet和ShuffleNet性能更好。
作者认为,DenseNet对特征的利用存在冗余,即每一层不必接收前面所有层的特征输出。为了降低这些冗余,作者提出了一种剪枝机制。之前的文章中,剪枝多是在网络训练之后,按照连接的权值大小或者其他连接重要性评估参数进行剪枝。==本文的剪枝采用了另外一种策略,即在训练的过程中进行,在训练时学习一个稀疏的网络。此外,作者将卷积核分为多个组,在训练的过程中,逐渐较少每个组内不重要的参数连接,对卷积核进行修剪。==值得注意的是,这种分组的模式不是固定的,而是网络自己学习到的。

Figure1中左边图是DenseNet的结构。第三层的11 Conv主要起到channel缩减的作用,第五层的33 Conv生成k个channel的输出。Figure1中间图是CondenseNet在训练时候的结构,Permute层的作用是为了降低引入11 L-Cconv对结果的不利影响,实现的是channel之间的调换过程。需要注意的是原来11 Conv替换成了11 L-Conv(learned group convolution),原来的33 Conv替换成了33 G-Conv(group convolution)。Figure1中右边图是CondenseNet测试时候的结构,其中的index层的作用在于feature selection,具体要选择哪些feature map,是在Figure1中间图中训练完的时候就确定的,因此index层只是一个类似0-1操作。另外要注意由于添加了Index层,所以原来Figure1中间图中的11 L-Conv层在Figure1右边图中替换成常规的卷积group层:1*1 G-Conv,这是训练和测试时候的一个不同点。

特点,优点:

本文中主要用到了三大策略,分别是自学习分组卷积、索引层、指数递增k值等结构改进。

(1)自学习分组卷积机制
针对上图的1x1卷积,由于其输入通道数较多,所以作者自然而然的想到了采用分组卷积来降低计算量,如上图中(训练阶段)、右(测试阶段)所示。而如何分组是一个问题。作者尝试了顺序分组和随机分组几种方法,发现顺序分组带来较大的精度损失。作者推测可能是因为密集连接的每一层接收的是前面所有输出特征的串联,串联的特征图存在内在的顺序,按照所谓的排序顺序进行分组破坏了这种内在顺序。若采用随机分组,效果好一点但是还是难以避免精度损失的问题。
==作者提出了learned group convolution,即自学习分组卷积。==学习分组的过程如下图所示。
如图,学习分组的过程分为多个阶段,分别是浓缩阶段、优化阶段、测试阶段。其中,浓缩阶段分为两步(或多步),

第一步为常规的卷积训练。在训练过程中加入了稀疏正则化,即loss函数中采用group Lasso进行正则。这样的好处是,学习到的参数可以呈现结构化稀疏的分布,后续对权值进行剪枝时不会带来太大的精度损失。这一点还是很好理解的,剪去一个权值为0的连接对网络没有精度影响。

第二步为剪枝,如前所述,剪枝基于通道进行,确定了分组数后,每组输出通道内对应的输入通道相同,稀疏度也相同。即,每组内由原来的全通道连接模式剪去相同数量的连接数。剪去的数量是按照一定比例的,后文有提到。

在优化阶段,在此基础上进一步进行剪枝,最终达到预设的比例。

剪枝完成后,每组内对应的残留的输入通道个数,与所有输入通道数的比例,即为浓缩因子C。如图中,输入通道为12个,设置C为3的话,每组应保留三分之一的通道,即12/3=4。并且修剪的过程也是由C来定义的。给定浓缩因子C,浓缩阶段包含C-1步,其中第一步是常规稀疏正则化训练,剩余的C-2步进行修剪。每个浓缩阶段,剪去1/C的通道数。在优化阶段,再剪掉1/C。所以,到了训练阶段,只剩下1/C通道了。
2)索引层
除了分组卷积之外,作者还添加了一个索引层,便于后续卷积层利用现有框架的常规分组卷积进行计算。下图很好理解了。

唯一的问题是,如果浓缩因子小于分组数的话,中间的索引层将会包含比输入特征图更多的特征图。

3)结构改进
除了前面两点之外,作者还进行了另外两点新的改进,使之结构更简化,计算效率更高。如下图所示。

指数递增的增长率
上文提到,每层卷积层的输入通道数以k逐层递增,也就是说,前面每层传递给后面的卷积层的通道数都是k个。所谓远亲不如近邻,高层的卷积层可能更依赖于中高层的特征,而较少依赖于底层的特征。为了体现不同层的重要性,作者引入了指数递增的增长率k,同一个block内采用相同的k,随着block数增加,k值呈指数增长。从而强化近处层的连接,弱化较远层的连接。通过逐步增加增长率,后面某一层接收到底层的输出通道数少,而接收到近处层的输出通道数多。作者也承认,这样做是具有双面性的,一方面可以增强计算效率,一方面可能降低参数效率。
全密集连接
区别于DenseNet中的只有dense block内采用密集连接模式,所谓全密集连接即每一层都与前面其它层呈密集连接关系。如图所示。为了将不同尺寸的特征图级联起来,采用降采样进行分辨率的统一。

pytorch实现:
class _DenseLayer(nn.Module):def __init__(self, in_channels, growth_rate, args):super(_DenseLayer, self).__init__()self.group_1x1 = args.group_1x1self.group_3x3 = args.group_3x3### 1x1 conv i --> b*kself.conv_1 = LearnedGroupConv(in_channels, args.bottleneck * growth_rate,kernel_size=1, groups=self.group_1x1,condense_factor=args.condense_factor,dropout_rate=args.dropout_rate)### 3x3 conv b*k --> kself.conv_2 = Conv(args.bottleneck * growth_rate, growth_rate,kernel_size=3, padding=1, groups=self.group_3x3)def forward(self, x):x_ = xx = self.conv_1(x)x = self.conv_2(x)return torch.cat([x_, x], 1)class _DenseBlock(nn.Sequential):def __init__(self, num_layers, in_channels, growth_rate, args):super(_DenseBlock, self).__init__()for i in range(num_layers):layer = _DenseLayer(in_channels + i * growth_rate, growth_rate, args)self.add_module('denselayer_%d' % (i + 1), layer)class _Transition(nn.Module):def __init__(self, in_channels, args):super(_Transition, self).__init__()self.pool = nn.AvgPool2d(kernel_size=2, stride=2)def forward(self, x):x = self.pool(x)return xclass CondenseNet(nn.Module):def __init__(self, args):super(CondenseNet, self).__init__()self.stages = args.stagesself.growth = args.growthassert len(self.stages) == len(self.growth)self.args = argsself.progress = 0.0if args.data in ['cifar10', 'cifar100']:self.init_stride = 1self.pool_size = 8else:self.init_stride = 2self.pool_size = 7self.features = nn.Sequential()### Initial nChannels should be 3self.num_features = 2 * self.growth[0]### Dense-block 1 (224x224)self.features.add_module('init_conv', nn.Conv2d(3, self.num_features,kernel_size=3,stride=self.init_stride,padding=1,bias=False))for i in range(len(self.stages)):### Dense-block iself.add_block(i)### Linear layerself.classifier = nn.Linear(self.num_features, args.num_classes)### initializefor m in self.modules():if isinstance(m, nn.Conv2d):n = m.kernel_size[0] * m.kernel_size[1] * m.out_channelsm.weight.data.normal_(0, math.sqrt(2. / n))elif isinstance(m, nn.BatchNorm2d):m.weight.data.fill_(1)m.bias.data.zero_()elif isinstance(m, nn.Linear):m.bias.data.zero_()returndef add_block(self, i):### Check if ith is the last onelast = (i == len(self.stages) - 1)block = _DenseBlock(num_layers=self.stages[i],in_channels=self.num_features,growth_rate=self.growth[i],args=self.args,)self.features.add_module('denseblock_%d' % (i + 1), block)self.num_features += self.stages[i] * self.growth[i]if not last:trans = _Transition(in_channels=self.num_features,args=self.args)self.features.add_module('transition_%d' % (i + 1), trans)else:self.features.add_module('norm_last',nn.BatchNorm2d(self.num_features))self.features.add_module('relu_last',nn.ReLU(inplace=True))self.features.add_module('pool_last',nn.AvgPool2d(self.pool_size))

CondenseNet总结相关推荐

  1. CondenseNet: An Efficient DenseNet using Learned Group Convolutions

    具体代码请见:https://github.com/ShichenLiu/CondenseNet class CondenseNet(nn.Module):def __init__(self, arg ...

  2. 关于densenet的改进:condensenet、VoVNet

    1.condensenet 提出可学习分组卷积,使网络更加轻量化 2.VoVNet 实时目标检测 论文:An Energy and GPU-Computation Efficient Backbone ...

  3. 轻量级网络之CondenseNet

    轻量级网络之CondenseNet CondenseNet: An Efficient DenseNet using Learned Group Convolutions 2018CVPR的网络,文章 ...

  4. 面向Mobile device的CNN模型手工设计与NAS分析总结,MobileNet V1,V2,V3,Efficient,MNasNet以及Efficient network design

    手工方法和NAS的高效网络模型设计总结与分析 这篇文章主要关注对于移动端,资源受限平台的高效神经网络设计(Manually)和搜索(NAS). ​​​​​​高效的CNN设计不只是用在服务器,云端,资源 ...

  5. 14种轻量级网络综述 — 主干网络篇

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨VincentLee 来源丨晓飞的算法工程笔记 编辑丨极市平台 导读 早期的卷积神经很少考虑参数 ...

  6. 算法应用与加速器系统架构的碰撞:AI软硬结合的方向怎么走?

    2021年9月18日下午,"算法应用与加速器系统架构的碰撞"讨论会在智源研究院顺利举行.参与封闭研讨的专家有:孙广宇,北京大学高能效计算与应用中心长聘副教授:黄高,清华大学助理教授 ...

  7. 探索可解释及稳定性,AI与博弈,自适应推理——“智源论坛:机器学习青年学者报告会”要点总结

    6月10日,北京智源人工智能研究院(BAAI)继"人工智能的数理基础"后,发布"机器学习"重大研究方向,由颜水成教授担任首席科学家,拟针对当前以深度学习.强化学 ...

  8. 分组卷积新进展,全自动学习的分组有哪些经典模型?

    作者&编辑 | 言有三 1 CondenseNet CondenseNet 以前我们给大家讲了许多的分组网络,如果分组本身可以学习,而不是通过预先定义的规则,可能取得更好的效果,其中的一个典型 ...

  9. 「AI不惑境」移动端高效网络,卷积拆分和分组的精髓

    https://www.toutiao.com/a6714182512374989323/ 大家好,这是专栏<AI不惑境>的第六篇文章,讲述卷积拆分和分组卷积的精髓. 进入到不惑境界,就是 ...

最新文章

  1. python 写文件 换行_Python学习16:读写文件
  2. macbook下载苹果版Photoshop cc2019 for mac
  3. hierarchy change in CRM - step2 outbound R3AUIBASE queue
  4. ui原型设计工具_UI设计师的工具包,用于专业模型,原型和产品插图
  5. unc 隐藏共享文件夹_你真的了解任务栏吗?win10任务栏居然隐藏了这么多小窍门...
  6. Kubernetes 入门:运行不同类型的 Job
  7. 事件驱动的javascript
  8. 3000类别,20万个标注,山师等推出大规模Logo检测数据集:LogoDet-3K
  9. mysql 删除数据_3.MySQL数据库创建、查询、删除
  10. fastdfs:安装nginx
  11. Unity3D调用外部程序
  12. python3 词频统计代码_Python词频统计代码,python
  13. 基于VPX总线架构下的Virtex-7与C6678信号处理的VPX功能板简介
  14. MySQL高级-04-授课笔记
  15. imx6获取和同步时间
  16. Vue3嵌入krpano
  17. 简述什么是FBV和CBV
  18. C语言中用do while解决阶乘之和问题
  19. oracle中segment_name,Oracle segment_name为数字的怪象
  20. 万能声卡驱动(Alsa)的安装方法

热门文章

  1. linux 连个文件都删除不了,什么鬼!
  2. 不就是SELECT COUNT语句吗,竟然能被面试官虐的体无完肤
  3. 老板要做DDD改造,我现在慌得一比!
  4. 阿里技术专家光锥:亿级长连网关的云原生演进之路
  5. 钉钉崩,钉钉崩,钉钉崩完QQ群崩...
  6. linux redhat 下让redis以服务方式运行
  7. 自己动手 CentOS-6.5 安装Oracle11g R2
  8. Vue学习笔记(3)(Vue CLI)
  9. SqlBulkCopy批量插入数据库
  10. 单用户登陆demo-后者挤到前者,类似QQ