『优秀论文精选』
《如何看待Face++出品的小型化网络ShuffleNet?》
论文地址:https://arxiv.org/abs/1707.01083
放arxiv那天看了一下,整篇paper思路读下来还是非常清晰的,实验效果也很不错。
整体的网络结构设计延续了ResNe(X)t的设计思路,主要不同的地方在于
(1)把bottleneck中的1x1 conv也换成了group conv (因为实际1x1 conv也占据了很大一部分计算量),原本的3x3 group conv用最极端的depthwise conv代替。然后为了解决stacked group conv造成的上一层group conv中特定的一些feature只作用于下一层一部分group conv带来的weakens representation问题(这里我觉得可以理解成在stacked group conv里不同group的feature是没有被aggregate的),把上一层不同group conv得到的feature做了一个channel shuffle,来保证group feature在不同group之间的流动。
(2)downsample的block用3x3 stride2的avg pool代替了之前的1x1 stride2的conv,然后用concat代替sum,使得原本应该加倍的filter数保持不变。这应该算是两个减少计算量的技巧吧,可能对实际的效果不会有太大的影响。
其他的像depthwise conv后面没加ReLU什么的就不提了。
实验结果是优于mobilenet的,特别是在小模型上(40MFLOPS级别的arch2比mobilenet高了接近7个点),其他的ablation study还有detection的实验paper里都写的十分详细了。
实现上也比较方便,channel shuffle用现有的reshape, transpose做个组合就行了,流程应该是:
先把(b,g*n,h,w)reshape成(b,g,n,h,w),然后transpose为(b,n,g,h,w)之后再reshape成(b,n*g,h,w)
所以算法上复现起来应该也不是很难,比较难的是有一个高效的depthwise conv以及pointwise group conv的实现。
----------------------------------------
用过的都说好。
ShuffleNet 0.25x 的运算量是 13M
在224x224x3的图上,
算一下gradient强度需要0.6M
做一次3x3的高斯模糊需要0.9M
卷一个5x5的kernel需要3.8M
卷一个7x7的kernel需要7.4M
运行AlexNet第一层需要105.4M
跑一个1000分类的linear svm需要150M
而这个神奇的小网络不光输出了1000分类的label,还能产生 384通道的feature map
----------------------------------