背景:
MobileNet v1中DW卷积在训练完之后部分卷积核会废掉,大部分参数为“0”
MobileNet v2网络是由Google团队在2018年提出的,相比于MobileNet v1网络,准确率更高,模型更小
网络亮点:
Inverted Residuals(倒残差结构)
Linear Bottlenecks
倒残差结构:
Residual Block:
ResNet网络中提出了一种残差结构
1.输入特征矩阵采用1*1的卷积核来对特征矩阵做压缩,减少输入特征矩阵的channel
2.采用3*3的卷积核做卷积处理
3.采用1*1的卷积扩充channel
形成两头大,中间小的瓶颈结构
Inverted Residual Block:
1.采用1*1的卷积核升维,让channel变得更深
2.通过卷积核大小为3*3的DW卷积操作进行卷积
3.通过1*1的卷积进行降维
结构图:
过程:
1.通过大小为1*1的卷积,激活函数为ReLU6
2.通过DW卷积,卷积核大小为3*3,激活函数为ReLU6
3.通过卷积核大小为1*1的卷积处理,使用线性激活
1.h*w*k的输入,经过1*1卷积核、ReLU6(t为扩展因子,1*1卷积核的个数为tk),输出h*w*(tk)
2.第二层输入等于第一层输出,使用DW卷积,卷积核大小为3*3,步距为s(给定),输出的特征矩阵深度和输入特征矩阵的深度相同(MobileNet v1中提到过DW卷积),由于步距为s,输出特征矩阵的高宽缩减为和
3.第三层的1*1卷积为降维操作,所采用的卷积核个数为
ReLU6激活函数:
ReLU激活函数的改进版,诸如此类的改进函数还有很多,类似Leakey ReLU等
在普通的ReLU激活函数中,当输入值小于零,默认全置零;当输入值大于零,不对值进行处理
在ReLU6激活函数中,当输入值小于零,默认全置零;在(0,6)区间,不会改变输入值;当输入值大于“6”,将输入值全部置为“6”
作用:
①避免网络出现激活值过大的情况,稳定训练过程
②适合量化
③保留非线性特征
④提高训练速度
对比:
原始的残差结构是先降维再升维,而倒残差结构是先升维再降维
在普通残差结构中使用的ReLU激活函数,而倒残差结构采用的是ReLU6激活函数
shortcut:
在倒残差结构中,并不是每一个倒残差结构都有shortcut(捷径)分支,在论文中提到当stride=1时有捷径分支,stride=2时没有捷径分支
分析得知上述表达有误:当stride=1且输入特征矩阵与输出特征矩阵shape相同时,才有shortcut连接;若不满足都没有shortcut
倒残差结构的作用:
1. 高效的特征提取:结合深度卷积和逐点卷积,能够有效提取特征,同时减少计算复杂度。
2. 减少梯度消失问题:通过直接将输入特征传递到输出,减轻了深层网络中的梯度消失问题,有助于更快收敛。
3. 灵活的通道扩展:通过设置 expand_ratio
,可以灵活调整特征维度,增强模型的表达能力,同时避免不必要的计算。
4. 内存和计算效率:尽管在某些情况下会增加参数量,但整体上,倒残差结构通常能保持相对较低的内存和计算需求,适合在移动设备上运行。
5. 增强非线性变换:通过激活函数,倒残差结构能够引入非线性,使得模型可以学习更复杂的特征关系。
6. 适应性强:能够根据不同任务的需求,调整网络的复杂性和参数设置,适应多种应用场景。
Linear Bottlenecks:
对于倒残差结构的最后一个1*1卷积层,使用线性激活函数而不是ReLU激活函数
线性激活函数使用原因:
在原论文中,作者做了相关实验。输入是二维的矩阵,channel为1,分别采用不同维度的Matrix(矩阵)对其进行变换,变换到一个更高的维度;再使用ReLU激活函数得到输出值;再使用矩阵的逆矩阵,将输出矩阵还原为2D特征矩阵
当Matrix 维度为2和3时,通过观察下图可以发现,二维三维的特征矩阵丢失了很多信息
但随着Matrix 的维度不断加深,丢失的信息越来越少
总结:
ReLU激活函数会对低维特征信息造成大量损失,而对于高维特征造成的损失小
倒残差结构为“两边细,中间粗”,在中间时为一个低维特征向量,需要使用线性函数替换ReLU激活函数,避免信息损失
网络结构:
t:扩展因子
c:输出特征矩阵的深度,channel
n:bottleneck(论文中的倒残差结构)重复的次数
s:步距,只代表每一个block(每一个block由一系列bottleneck组成)的第一层bottleneck的步距,其他的步距都为1
当stride=1时:输入特征矩阵的深度为64,输出特征矩阵的深度为96;若有捷径分支,捷径分支的输出的特征矩阵分支深度为64,但是通过主分支的一系列操作,所输出的深度为96,很明显深度时不同的,无法使用加法操作,也就无法使用shortcut
对于上述提到的block的第一层一定是没有shortcut的,但对于第二层,stride=1(表中的s只针对第一层,其他层的stride=1),输入特征矩阵深度等于上一层输出特征矩阵的深度,为96;输出特征矩阵深度为96,因此在bottleneck第二层输出特征矩阵的shape和输入特征矩阵的shape相同,此时可以使用shortcut分支
在网络的最后一层为一个卷积层,就是一个全连接层,k为分类的个数
性能分析:
图像分类:
准确率,模型参数都有一系列的提升,基本上达到了实时的效果
目标检测:
将MobileNet与SSD联合使用,将SSD中的一些卷积换为DW卷积和PW卷积,相比原始的模型有一些提升,但对比MNet v1却差了一些
总结:
基本实现了在移动设备或嵌入式设备上跑深度学习模型,也将研究和日常生活紧密结合