最全MobileNet:深度可分离(原理及代码),瞬间高大上了

总结

一般像这样的大企业都有好几轮面试,所以自己一定要花点时间去收集整理一下公司的背景,公司的企业文化,俗话说「知己知彼百战不殆」,不要盲目的去面试,还有很多人关心怎么去跟HR谈薪资。

这边给大家一个建议,如果你的理想薪资是30K,你完全可以跟HR谈33~35K,而不是一下子就把自己的底牌暴露了出来,不过肯定不能说的这么直接,比如原来你的公司是25K,你可以跟HR讲原来的薪资是多少,你们这边能给到我的是多少?你说我这边希望可以有一个20%涨薪。

最后再说几句关于招聘平台的,总之,简历投递给公司之前,请确认下这家公司到底咋样,先去百度了解下,别被坑了,每个平台都有一些居心不良的广告党等着你上钩,千万别上当!!!

Java架构学习资料,学习技术内容包含有:Spring,Dubbo,MyBatis, RPC, 源码分析,高并发、高性能、分布式,性能优化,微服务 高级架构开发等等。

还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书。
在这里插入图片描述

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 通道之间相互独立,没有各通道间的特征融合,这也是逐通道卷积的核心思想,例如上图中输出特征的每一个点只对应输入特征一个通道上的3×3大小的特征,而不是标准卷积中Ci×3×3大小。

  • 由于只在通道间进行卷积,导致输入与输出特征图的通道数相同,无法改变通道数。 逐通道卷积的总计算量如式所示。

Fd=Ci×3×3×H×W

由于逐通道卷积通道间缺少特征的融合,并且通道数无法改变,因此后续还需要继续连接一个逐点的1×1的卷积,一方面可以融合不同通道间的特征,同时也可以改变特征图的通道数。由于这里1×1卷积的输入特征图大小为Ci×H×W,输出特征图大小为Co×H×W,因此这一步的总计算量如式所示。

Fd=Ci×3×3×H×W

综合这两步,可以得到深度可分离卷积与标准卷积的计算量之比,如式(7-4)所示。

可以看到,虽然深度可分离卷积将卷积过程分为了两步,但凭借其轻量的卷积方式,总体计算量约等于标准卷积的1/9,极大地减少了卷积过程的计算量。 MobileNet v1使用的深度可分离模块的具体结构如下图所示。其中使用了BN层及ReLU的激活函数。值得注意的是,在此使用了ReLU6来替代原始的ReLU激活函数,将ReLU的最大输出限制在6以下。

ReLU6的原因:

使用ReLU6的原因主要是为了满足移动端部署的需求。移动端通常使用Float16或者Int8等较低精度的模型,如果不对激活函数的输出进行限制的话,激活值的分布范围会很大,而低精度的模型很难精确地覆盖如此大范围的输出,这样会带来精度的损失。

整体对比图:

MobileNet v1结构


MobileNet v1整体的网络是由上述深度可分离卷积基本单元组成的,具体结构如下图所示。与VGGNet类似,也是一个逐层堆叠式网络。图中的Dw代表一个深度分解卷积,其后需要跟一个1×1卷积s2代表步长为2的卷积,可以缩小特征图尺寸,起到与Pooling层一样的作用。

这里列出的是MobileNet v1用于物体分类的网络,可以看到网络最后利用一个全局平均池化层,送入到全连接与Softmax进行分类预测。如果用于物体检测,只需要在之前的特征图上进行特征提取即可。 在基本的结构之外,MobileNet v1还设置了两个超参数,用来控制模型的大小与计算量,具体如下:

  • 宽度乘子:用于控制特征图的通道数,记做α,当α<1时,模型会变得更薄,可以将计算量减少为原来的α2。

  • 分辨率乘子:用于控制特征图的尺寸,记做ρ,在相应的特征图上应用该乘子,也可以有效降低每一层的计算量。

在实现层面上,PyTorch中卷积层提供了一个组卷积参数,可以方便地实现深度可分离卷积。下面利用PyTorch搭建一个MobileNet v1网络,新建一个mobilenet_v1代码如下:

from torch import nn

class MobileNet(nn.Module):

def init(self):

super(MobileNet, self).init()

# 标准卷积

def conv_bn(dim_in, dim_out, stride):

return nn.Sequential(

nn.Conv2d(dim_in, dim_out, 3, stride, 1, bias=False),

nn.BatchNorm2d(dim_out),

nn.ReLU(inplace=True)

)

# 深度分解卷积

def conv_dw(dim_in, dim_out, stride):

return nn.Sequential(nn.Conv2d(dim_in, dim_in, 3, stride, 1, groups= dim_in, bias=False),

nn.BatchNorm2d(dim_in),

nn.ReLU(inplace=True),

nn.Conv2d(dim_in, dim_out, 1, 1, 0, bias=False),

nn.BatchNorm2d(dim_out),

nn.ReLU(inplace=True),

)

# MobileNet每一个卷积组的结构参数

self.model = nn.Sequential(

conv_bn( 3, 32, 2),

conv_dw( 32, 64, 1),

conv_dw( 64, 128, 2),

conv_dw(128, 128, 1),

conv_dw(128, 256, 2),

conv_dw(256, 256, 1),

conv_dw(256, 512, 2),

conv_dw(512, 512, 1),

conv_dw(512, 512, 1),

conv_dw(512, 512, 1),

conv_dw(512, 512, 1),

conv_dw(512, 512, 1),

conv_dw(512, 1024, 2),

conv_dw(1024, 1024, 1),

nn.AvgPool2d(7),

)

self.fc = nn.Linear(1024, 1000)

def forward(self, x):

x = self.model(x)

x = x.view(-1, 1024)          # 前向过程中在全连接前将特征图平展成1维

x = self.fc(x)

return x

小结

总体上,MobileNet v1利用深度可分离的结构牺牲了较小的精度,带来了计算量与网络层参数的大幅降低,从而也减小了模型的大小,方便应用于移动端。 但MobileNet v1也有其自身结构带来的缺陷,主要有以下两点:

  • 模型结构较为复古,采用了与VGGNet类似的卷积简单堆叠,没有采用残差、特征融合等先进的结构。

  • 深度分解卷积中各通道相互独立,卷积核维度较小,输出特征中只有较少的输入特征,再加上ReLU激活函数,使得输出很容易变为0,难以恢复正常训练,因此在训练时部分卷积核容易被训练废掉。

MobileNet v2结构


论文地址:https://arxiv.org/abs/1801.04381

针对以上MobileNet v1的缺点,2018年诞生的MobileNet v2吸收了残差网络的思想,主要从两个方面改善了网络结构,提升了MobileNet的检测精度。

首先,MobileNet v2利用**残差结构取代了原始的卷积堆叠方式,提出了一个Inverted Residual Block结构,**如上图所示。依据卷积的步长,该结构可分为两种情形,在步长为1时使用了残差连接,融合的方式为逐元素相加。 相比于MobileNet v1与原始的残差结构,这里有两点不同:

1.Inverted Residual Block结构

由于3×3卷积处的计算量较大,因此传统的残差网络通常先使用1×1卷积进行特征降维,减少通道数,再送入3×3卷积,最后再利用1×1卷积升维。这种结构从形状上看中间窄两边宽,类似于沙漏形状。 然而在MobileNet v2中,由于使用了深度可分离卷积来逐通道计算,本身计算量就比较少,因此在此可以使用1×1卷积来升维,在计算量增加不大的基础上获取更好的效果,最后再用1×1卷积降维。这种结构中间宽两边窄,类似于柳叶,该结构也因此被称为Inverted Residual Block。

2.去掉ReLU6

深度可分离卷积得到的特征对应于低维空间,特征较少,如果后续接线性映射则能够保留大部分特征,而如果接非线性映射如ReLU,则会破坏特征,造成特征的损耗,从而使得模型效果变差。 针对此问题,MobileNet v2直接去掉了每一个Block中最后的ReLU6层,减少了特征的损耗,获得了更好的检测效果。 下面利用PyTorch构建MobileNet v2的残差模块,上图中的stride为1的结构,新建一个mobilenet_v2代码如下:

最后

经过日积月累, 以下是小编归纳整理的深入了解Java虚拟机文档,希望可以帮助大家过关斩将顺利通过面试。
由于整个文档比较全面,内容比较多,篇幅不允许,下面以截图方式展示 。







由于篇幅限制,文档的详解资料太全面,细节内容太多,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

解资料太全面,细节内容太多,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!**

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 25
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值