ShuffleNet之于MobileNet的改进点

总结一下ShuffleNet相比MobileNet在网络结构上的改进。

先讲讲MobileNet。MobileNet是一种轻量级网络,其运行方式决定其在CPU和GPU上运行速度的差距比普通卷积神经网络要小,因为其读取非连续内存的次数相比普通神经网络要小。为什么呢?因为MobileNet中的3X3卷积的输入是一张来自上一层的feature map,而非来自上一层的全部feature map。举个例子,在0 pad的情况下,相比输入3X3XDepth个数字,输入3X3X1个数字发生跨行读取的可能性大幅减少了。1、MobileNet将3X3卷积拆分成单通道3X3卷积和普通1X1卷积。1X1卷积可以看作是对feature map的线性组合,那么1X1卷积配合上3X3单通道卷积也就等价于一个普通3X3卷积。区别在于,3X3卷积核内的权值分布比例变得固定了,或者说单通道3X3卷积所携带的pattern数量要小于普通3X3卷积所携带的pattern数量,只有在极为特别的情况下,也就是pattern之间线性无关的部分组成的矩阵满秩时,二者才能等价。2、MobileNet的单通道3X3卷积与普通1X1卷积之间是有BN和激活函数的。在inference阶段,BN就是一个线性操作,可以直接加到BN之前的卷积核上,插一句,BN的引入使得卷积层不再需要有bias,因为bias会被接下来的BN层再偏移回去。那么就剩下一个激活函数了,根据Xception论文中的实验结果,不使用激活函数的效果可能会好于使用激活函数,虽然Xeception与MobileNet是两种不同的情况,一个是先对feature map线性组合再进行空间卷积,另一个是先空间卷积再对feature map进行线性组合。

然后是ShuffleNet。ShuffleNet希望能够进一步简化计算量,那么MobileNet简化计算量的空间在哪呢?3X3卷积已经被彻底拆散了,已经是分组卷积的极限了。剩下的只能是对1X1卷积进行分组了,这时候会带来问题,通道之间关联性随着分组数的增加而减小,没有(或者缺乏)了通道间关联性的卷积层会导致通道间无法信息沟通,也就意味着训练中无法产生通道间的分工,可能导致的结果就是训练完了多个通道间的权值分布相差不大。为了解决这个问题,ShuffleNet引入了ShuffleLayer,它的作用是在训练中随机打乱通道,强制通道间产生关联性。此外,ShuffleNet还借鉴ResNet的瓶颈模型,在3X3之前加上一个同样被分组了的1X1卷积核。所以ShuffleNet可以说是ResNeXt和MobileNet的集合体。

你可能感兴趣的:(ShuffleNet之于MobileNet的改进点)