v1 paper:https://arxiv.org/pdf/1707.01083.pdf
v2 paper:https://arxiv.org/abs/1807.11164
code:本文不提供code,参见各个框架的reademe
讲道理,存在mobilenet的情况下,我对shuffleNet的用法就少了很多,最大的存在感是shuffleNetV2提出了嵌入式芯片设计网络时的准则(gpu也是同理),这个才是关键所在,其他的一般情况下还是用mobilenet比较成熟,配合检测算法用的也比较多,部署框架支持的也多一些。其实我觉得v2提出来最重要的体验就是,解释了为啥resnext等网络,总是号称这么设计参数量减少了,但是跑起来远没有renet快,解释的相当到位,本文将介绍shufflenet的技术要点和变化,但不按照文章格式解析。
1、ShuffleNet V1
1、原理
我们直接看v1的结构图,相当直白:
如上图所示,图a是常规的group conv结构,alexnet中用到了,当时其实也是为了增快速度,减少内存占用,跟精度没什么关系,带来的问题是,输出通道只和输入的某些通道有关,导致全局信息不流畅,网络表达能力差。图b在进行Gconv2之前,对输入的featuremap做一个随机分配,称之为“均匀打乱”。图c就是shufflel后的效果图。
原文提到,code是如何操作的:
假定将输入层分为 g组,总通道数为g*n,首先你将通道那个维度拆分为(g,n)两个维度,然后将这两个维度转置变成(n,g),最后重新reshape成一个维度g*n。
2、shufflenet unit
shuffle 单元结构如下图所示:
如上图所示,图a是mibilenet的结构单元,应该是类似于v1的结构,详情参见我上一篇博客;
图b是本文的一种模块,就是在第一个模块的基础上,conv替换为gconv,并加入了一个channel shuffle的操作,但是feature输出前后的size不会发生变化;
图c是本文的另外一个模块,在输入分支上添加了一个stride=2的avg pool,且在dwconv的位置去stride=2,然后将原来的resnet的add变成了特征的concat操作,将channel进行合并。