深度学习【35】CondenseNet

condenseNet与mobilenet、shuffleNet一样都是小而精悍的模型。与shuffleNet一样都是为了优化1*1卷积的计算量。同时借鉴了denseNet的跳跃连接和shuffleNet的channel shuffle。但是没有使用mobilenet的depthwise 3*3卷积,而是使用了分组卷积。condenseNet比mobilenet模型小了6M,计算量小了2倍,同时在imageNet上的top1精度一样。当condenseNet的模型大小与mobilenet一样时,在imageNet上的top1比mobilenet少了3%.

condenseNet主要创新是提出了可学习的分组卷积,论文中主要是针对1*1卷积,当然也可以在其他大的卷积核中使用。

我们先看看标准卷积与分组卷积的差别,从下图可以看出,分组卷积有点像标准卷积的稀疏卷积版本。只是分组卷积没那么随机,每个组的输入图片之间的通道是不交叉的。
深度学习【35】CondenseNet
其实该论文提出的可学习分组卷积,就是利用了网络压缩技术中的稀疏网络原理。即在训练期间根据卷积核的L1值对卷积核进行置零操作。

正常的分组卷积,只要输入通道数确定了,那么每一组的输入通道数也就固定了。如,输入通道为256,分为4组,那么每一组的输入通道为256/4=64。但是论文并没有这个做,而是设置了一个condensation factor。这个因子的作用是什么呢,举个例子:假设输入通道总数为12,condensation factor=4,分成3组,那么每一组的输入通道数为12/4=3(正常的分组卷积,每一组的输入通道数应该为12/3=4)。也就是这个condensation fractor控制着每一个分组的输入通道数,这样就能够进一步压缩网络。

好了,我们直接先看看论文给出的一张图:
深度学习【35】CondenseNet

图中的condensation factor=3,这样一共有3个训练阶段。分别是:1、一开始的condensing stage 1,这个阶段没有进行裁剪。2、Condensing Stage 2,这个阶段裁剪了1/3 的卷积核(从12*2*3到8*2*3)。3、以及最后的Optimization Stage,这个阶段将卷积核个数裁剪到剩下1/3。在测试的时候,将剩下的输入特征图rearray一下,就能用正常的分组卷积操作了。我们可以看到,可学习的分组卷积最后的每一组的输入通道是会有交叉的。当然作者还是使用了一下channel shuffle操作。

其他的不多说了,我们在看看condenseNet是怎么用denseNet的跳跃连接的,condenseNet模型:
深度学习【35】CondenseNet

denseNet只在两个下采样之间的block里面的层有连接。但是condenseNet则所有的层都有连接。在连接过程中遇到特征图size不一样的就用下采样。

可学习分组卷积的训练过程可以参考作者给出的代码:https://github.com/ShichenLiu/CondenseNet

实验结果

主要看看模型大小和计算量

深度学习【35】CondenseNet