SqueezeNet:https://arxiv.org/abs/1602.07360
SqueezeNext:https://arxiv.org/abs/1803.10615
SqueezeNet和SqueezeNext是同一类型的轻量级网络,后者是前者的升级版,两篇文章读下来,第一个感受就是借鉴了很多Inception家族的思想,包括增加网络宽度来更好地利用运算资源,运用矩阵相乘的原理将K*K的矩阵分解成K*1和1*K,从而在效果不改变的情况下大幅减少参数量。接下去由我来对两篇文章做一个简短的分析。
1.SqueezeNet
文章SqueezeNet在摘要部分给出了小型轻量级网络的优势:
(1)在分布式训练中,与服务器通信需求更小 ;
(2)参数更少,从云端下载模型的数据量小 ;
(3)更适合在FPGA等内存受限的设备上部署。
其实对轻量级网络的设计是现在的一个趋势,虽然像ResNet、Inception-Resnet-V2以及NasNet-large这类网络,在各类图像数据集上的表现很出色,但这些网络的不足是计算量大、参数众多、模型体积大,非常不适合运用到一些嵌入式设备中去,所以在当前硬件资源受限的情况下,小型轻量级网络更受人们的青睐。
言归正传,SqueezeNet主要提出了一个fire model模块(如下图1),这个模块有点Inception块的味道,fire model包含压缩层和扩张层两部分,压缩层是由1*1的逐点卷积组成,它的作用是减少输入通道数,因为作者认为每一层的参数量与特征图的长、宽、输入通道和输出通道有关,减少输入通道就可以减少每一层的参数量;扩张层主要由1*1卷积层和3*3卷积层组成,可以使模型在一个更大空间内进行特征提取。而SqueezeNet由这个fire model堆叠而成,只是fire model模块里面1*1和3*3卷积数量略有不同。
同时,为了方便深层模型在训练时不发生梯度消失,作者在原来模型的基础上加入了ResNet的跳跃连接(如下图2),当然这些属于SqueezeNet的变体,这篇文章的核心还是fire model,读过Inception系列的文章,这篇文章是很好懂的。
2.SqueezeNext
SqueezeNext的题目叫做具有硬件感知的网络设计,这是一篇既讲了软件方面知识(即网络结构)又讲了硬件方面知识的文章,不过今天我只讲前者,后者部分我没看,主要实际在自己设计网络时不太会用得上。
SqueezeNext中的block主要是对SqueezeNet的fire model进行改进,将原来fire model中的压缩层从1层增加到了2层,使得通道数降到原来的1/4,同时去掉了原来扩展层中的1*1卷积,只使用3*3卷积,并且作者结合InceptionV3的设计思想,将3*3卷积拆成3*1和1*3,理论上两者的效果是等价的,这里面用到的是矩阵相乘的思想,所以原来3*3卷积的参数量是3*3=9,拆分后就只有3+3=6,相对减少了1/3,从而达到降参的目的。详细的SqueezeNext block如下图3所示。
上图3中C表示输入通道,首先通过压缩层的第一层,通道数降为原来的1/2,再通过压缩层的第二层,通道数将为原来的1/4,然后就是通过分离后的3*3层,3*1这一层是有增加通道数的,1*3这层通道数不变,这两层的通道数为1/2C,最后是通过一个逐点卷积进行升维操作,将通道数升到C,目的是方便与跳跃连接过来的信息进行特征融合,图3没有画出跳跃连接。
图4就是SqueezeNext中的block完整结构。
相比ResNet的残差结构,SqueezeNext中的block在残差块部分做了轻量化处理,就是对fire model 进行了修改,同时通道数也没有设计的很多,主要还是为了降低参数量。
SqueezeNext的网络架构形式有很多,下图5是其中一种最原始的网络架构。
同一种颜色代表同一种类型,尺寸和输入输出通道都一样,绿色框是一个平均池化层,池化窗口尺寸为7*7。
下图6是图5的具体参数。
作者在硬件上的实验发现,前面层的block的计算效率低,因而减少前面层的block数量,增加后面层的block数量。所以就有了下图7的这一结构。
具体就不做介绍了,它跟图6内容差不多,知识block放的位置改变了一下而已。当然这篇文章通过这个实验也告诉我们,在网络设计的时候,前面层的通道少一点,后面层通道多一些是可以提升网络性能的。