论文:CondenseNet: An Efficient DenseNet using Learned Group Convolutions
Github:https://github.com/ShichenLiu/CondenseNet
依然是DenseNet的一作康奈尔大学的黄高,算是DenseNet的轻量化的改进版,相比与DenseNet之需要其1/10的计算量,但是精度还保持一样。
论文贡献:
- 提出了压缩(condensation)版本的DenseNet,即CondenseNet。
- 提出了自学习组卷积L-Conv,实现了训练过程的网络剪枝
- 提出在测试阶段,使用index+g-Conv来替换L-Conv
网络改进点:
第一个表示DenseNet的结构,第二个表示CondenseNet在训练过程的结构,第三个表示CondenseNet在测试过程的结构。
可以看出,训练时CondenseNet将DenseNet中的1*1 conv变为1*1 L-conv,并且增加了permute操作,类似与shuffle操作。
测试时增加了index层,同时将1*1 L-conv变为1*1 G-Conv
1.自学习组卷积Learned Group Convolution
如上图所示,整个自学习的过程包含condensing stages (1,2),optimization stage ,testing stage 三个部分。condensing stages (1,2)训练过程占整个训练epoch数的一半,optimization stage占整个训练epoch数的一半。
condensing stages1主要做传统的卷积过程
condensing stages2主要做稀疏化的卷积操作
通过对所有的输入特征层,输入所有group后,得到输出的特征层,然后求其所有输出层的L1 norm,如果某个输入经过group conv操作后得到的输出特征小于平均的L1 norm,就会将该输入的特征层权值都置为0,实现剪枝操作,整个剪枝过程,贯穿整个训练过程。
condensing stages3主要做优化,
这里使用了Learned Group Convolution,可以通过网络的训练,网络自己学习,使得不同的输入特征层进入不同的group。
这里引入了一个新的参数,压缩因子condensation factor C ,该参数和group的数目不一样。在训练过程中,将会有(C-1)/C的连接数会被移除。
C主要用于计算每一个group中输入的特征数目,表示为
在上图中,group num=condensation facter=3
testing stage 主要是测试的过程。
这里引入了Index layer,主要将训练中学习到的特征层,基于group重新进行排序,使得跟每一个group的位置都对应一致,然后就可以将Learned Group Convolution 替换为Group Convolution。
2.将DenseNet中每个BLOCK模块中的1*1卷积换成了group conv
假设对于1*1卷积来说,输入channel为R,输出channel为O,则传统卷积的参数量为R*O,假设分成G个group数,采用group卷积的计算量为(R/G)*(O/G)*G=(R*O)/G,可见参数量减少了G倍。
3.网络整体结构上的2点改变
(1)增加了不同dense block之间的dense连接
(2)DenseNet中的每个dense block的增长率保持不变,而在CondenseNet中,将增长率设置为随着block的深度而增加。
这里增长率k如上式所示,其中,k0表示常数,m表示dense block的索引。
训练学习率:
训练过程的学习率采用cosine 形式的学习率,中间150 Epoch的时候出现loss的突增,是因为该过程进入优化过程,进行了压缩,减少了group连接数目,所以表现出突然loss的增加。
网络结构:
实验结果:
ImageNet分类任务的实验结果,可以看出G=C=8的精度比G=C=4时的精度要高,同时也得出,CondenseNet具有更少的参数量,同时和MobileNet,ShuffleNet相当的精度。
这个是对压缩因子(Condensation Factor)和分组数(Group Number)对网络精度的影响的实验验证。可以得出,随着压缩因子和分组数的增加,误差率也相应的降低。