SuffleNet
SuffleNet
ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices
旷视科技
摘要
MobileNet和SqueezeNet等一样主要是想应用在移动端
创新点
-
ResNeXt 在非常小的网络中效率会降低,因为密集的 1×1卷积 代价很高 ,基于此作者提出了 pointwise group convolution 以减少 1×1卷积 的计算复杂度 ;
-
为克制 pointwise group convolution 带来的副作用,提出了 channel shuffle 的操作,用于实现信息在特征通道之间流动 .
-
ShuffleNet与MobileNet的对比,ShuffleNet不仅计算复杂度更低,而且精度更好。
创新点讲解
DeepwiseConvolution(是一种GroupConvolution) (特征图数就是通道数)
分组卷积(Group Convolution)的概念首先是在 AlexNet 中引入,用于将模型分布到两块 GPU 上。- Group convolution是将输入层的不同特征图进行分组,就是说不同的通道分组成几个组,然后只用组数目的卷积核进行卷积,然后采用不同的卷积核再对各个组进行卷积,这样会降低卷积的计算量。
- 因为一般的卷积都是在所有的输入特征图上做卷积,可以说是全通道卷积,这是一种通道密集连接方式(channel dense connection)。
- 而group convolution相比则是一种通道稀疏连接方式(channel sparse connection)。
- Xception和MobileNet采用了depthwise convolution,这其实是一种比较特殊的group convolution,因此此时分组数恰好等于通道数,意味着每个组只有一个特征图。
- 但是这些网络存在一个很大的弊端是采用了密集的1x1卷积
Pointwise Group Convolution(也是一种GroupConvolution,针对1*1卷积)
- 为了解决MobileNet中用太多1*1卷积的问题,这里提出了Pointwise Group Convolution来替代1*卷积
- 不如也对1x1卷积采用channel sparse connection,那样计算量就可以降下来了。但是group convolution存在另外一个弊端是不同组之间的特征图是不通信的,这会降低网络的特征提取能力。
Channel Shuffle(针对1*1卷积之后)
目的:在分组卷积后,强制不同组之间交换信息。
通道洗牌(Channel Shuffle) 允许 分组卷积 从不同的组中获取输入数据,从而实现输入通道和输出通道相关联
经过pointwise group convolutiion和ChannelShuffle就可以修改Resnet基本结构
ShuffleNet的基本单元是在一个残差单元BottleNeck的基础上改进而成的。
基本单元(改3*3卷积)
-
BottleNeck把其中的3*3卷积改成GroupConvolution3*3卷积
-
首先是1x1卷积,然后是3x3的depthwise convolution(DWConv,主要是为了降低计算量),这里的3x3卷积是瓶颈层(bottleneck),紧接着是1x1卷积,最后是一个短路连接,将输入直接加到输出上。
再次改进(改1*1卷积,stride=1时)
-
将密集的1x1卷积替换成1x1的group convolution,不过在第一个1x1卷积之后增加了一个channel shuffle操作。
-
按paper的意思,对于这样一个残差单元,一个channel shuffle操作是足够了。
-
还有就是3x3的depthwise convolution之后没有使用ReLU激活函数。
-
如果stride=1时,此时输入与输出shape一致可以直接相加
-
再次改进(改shortcut,stride=2时)
- 当stride=2时,通道数增加,而特征图大小减小,此时输入与输出不匹配。一般情况下可以采用一个1x1卷积将输入映射成和输出一样的shape。但是在ShuffleNet中,对原输入采用stride=2的3x3 avg pool,这样得到和输出一样大小的特征图
- 然后将得到特征图与输出进行连接(concat),而不是相加。这样做的目的主要是降低计算量与参数大小。
网络架构
- 0.5x和0.25x表示的是在基准模型上将通道数缩小为原来的0.5和0.25
-
- 开始使用的普通的3x3的卷积和max pool层。然后是三个阶段,每个阶段都是重复堆积了几个ShuffleNet的基本单元。
- 对于每个阶段,第一个基本单元采用的是stride=2,这样特征图width和height各降低一半,而通道数增加一倍。后面的基本单元都是stride=1,特征图和通道数都保持不变。









