最近efficientnet和efficientdet在分类和检测方向达到了很好的效果,他们都是根据Google之前的工作mobilenet利用nas搜索出来的结构。之前也写过《轻量级深度学习网络概览》,里面提到过mobilenetv1和mobilenetv2的一些思想。下面基于slim mobilenet的实现版本来具体讲讲他们的结构
一、mobilenet-v1
mobilenet-v1创新部分
mobilenet-v1整体结构类似与VGG那种直通的结构,没有什么像resnet那样的残差结构,和之前大多数网络不一样的主要有两点:
- 采用了depthwise separable convolution来提高网络的计算速度,depthwise separate convolution包含了depthwise convolution和pointwise convolution
- 采用了Width Multiplier,Width Multiplier简单来说就是引入一个新的超参数来调节卷积输出的通道数从而更方便的平衡了网络的计算速度和精度。
其实文章还有引入了一个参数Resolution Multiplier ,这个参数来控制卷积层输入的分辨率大小,该参数用来减小网络的计算量,代码实现好像没有这个参数,之所以提一下是因为在efficientnet的设计中也有这个参数。
稍微再多说一嘴,depthwise convolution指的是对于输入的feature,每个通道都有一个单独对应的卷积与其进行计算。pointwise convolution可以理解为正常的conv,只是conv的大小为。正常的卷积和本文新提出的两种卷积形式如下图所示:
计算量对比
对于输入feature大小为,输出为的情况(其中为feature分辨率,M和N分别表示输入输出的通道数),对于大小为的标准卷积的计算量为
对于大小为的depthwise convolution,整个depthwise separable convolution的计算量为
mobilenet-v1的结构如下表所示
需要说明的是本文的所有卷积后面都跟一个bn和relu,不管是标准卷积还是depthwise separable convolution,如下图所示,还有一个需要注意的是所有的depthwise convolution没有参加或者以较小的权重参加l2正则计算。
3.png
二、mobilenet-v2
首先v2还是继承了v1的思想,即仍然采用了depthwise separable convolution。
其次文章提出两点结论:
- 感兴趣的特征在ReLU之后保持非零,近似认为是线性变换。
- ReLU能够保持输入信息的完整性,但仅限于输入特征位于输入空间的低维子空间中。
通过上述两点结论,文章认为可以在v1的基础上优化卷积结构,即在depthwise separable convolution后再加一个线性卷积(就是一个标准的的卷积,并且该卷积后面只跟一个bn不跟relu6),而且对于输入进relu6的特征,难免会造成一些信息的丢失,为了减少这种信息丢失,在输入relu6前,先使用expansion ratio,将特征的通道扩大,来减少特征的丢失。
简单理解就是,对于relu输出的低纬度空间,为了减少特征损耗采用线性卷积来提取特征。对于有relu的层,为了防止特征损耗太多,先将特征通道数增加。
最后参考resnet结构,也加入了shortcuts连接方式,目的是为了减缓BP时造成的梯度弥散。
最终得到的Bottleneck residual block如下所示
4.png
上面中的k是输入通道数,k'是输出通道数,s代表stride,t代表expansion ratio。上面省略了bn设置,其实每个卷积后面都跟了个bn。
mobilenet-v2的结构如下表所示
上表中,每一层重复层中,都是第一层stride为s,其它都为1.
欢迎加入Object Detection交流,群聊号码:910457072
网友评论