本文介绍旷视科技最近提出来的ShuffleNet, 目的同样也是利用特殊的网络结构达到参数少速度快的效果。
文章链接: 《ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices》
caffe实现: https://github.com/farmingyard/ShuffleNet
1. 方法介绍
方法很容易理解,如下图:
(1) 图a是一般的group convolution的实现效果(原理可以参考我的另一篇博文中的描述)。 其造成的问题是,输出通道只和输入的某些通道有关,导致全局信息流通不畅,网络表达能力不足。
(2) 图b就是本文的方法啦。 即通过均匀排列,把group convolution后的feature map按通道进行均匀混合, 这样就可以更好的获取全局信息了。 图c是操作后的等价效果图。
2. ShuffleNet Unit
整个ShuffleNet同样采用了类似于ResNet一样的模块化设计,如下图:
(1) 图a是之前的一种ResNet网络结构模块,其参考了“MobileNet”的实现。其中的DWConv指的是 depthwise convolution。
(2) 图b是本文给出的一种模块(输出前后feature的size不变), 相比于图a,只是将第一个1x1卷积改成了group convolution,同时后续增加通道 shuffle。
(3) 图c是本文给出的另一种模块(输出前后feature的size变小,但通道数增加),主要是为了应对下采样问题。 注意,最后的合并操作由原来的 “Add” 变成了 “Concat”, 目的是为了增加通道数。
3. 网络结构
原始版本的ShuffleNet的结构如下:(为了保证参数量基本一致,当使用不同group时作者调整了feature map的数量)
不同配置下的网络性能对比图:
- “s x”表示feature map的channels数量与原始结构的比例;
- arch2: 将stage3中的两个单元移除,同时增加整体的网络宽度。对于小网络,feture map的宽度至关重要。
4. 实验效果
下面给出ShuffleNet 同之前一些网络的对比效果:
整体上来看,相比Xception和Mobilenet,ShuffleNet都获得了性能上的提升,至于速度带来的提升则不是很明显。 毕竟,ShufflleNet的主要改进就只是增强了全局信息的流通。