文章目录
前言
本文介绍MobileNet 。
MobileNet V1
亮点:
- Depthwise Convolution(大大减少运算量和参数数量)DW卷积
- 增加超参数:人为设定的
α:控制卷积层、核数量
β:控制输入图像分辨率/尺寸
传统卷积&DW卷积
- 传统卷积:输入特征矩阵深度为3的特征矩阵,使用四个卷积核,每个卷积核的深度为3(和输入特征矩阵深度一样),卷积核个数和输出特征矩阵的深度一样。
- DW:每个卷积核的深度都是1,1个卷积核负责一个channel。所以卷积和的个数和输入特征矩阵的深度相同,输入特征矩阵和卷积核的个数相同。
Depthwise Separable Conv:深度可分卷积
深度可分的卷积操作:DW Conv + PW Conv(普通卷积,只是卷积核大小为1)。
参数量比较
Dk:卷积核的width/height M:输入特征矩阵的深度
N:输出特征矩阵的深度 Df:输入特征矩阵的width/height
MobileNet V1网络结构
表中conv/s2:普通卷积,stride=2,
Filter Shape 3*3*3*32:输入特征矩阵的高宽深为3*3*3,卷积核个数为32
conv dw/s1:DW卷积,stride=1
Filter Shape 3*3*32:DW卷积的深度为1,输入特征矩阵的高宽3*3,输出特征矩阵深度32
- Table 8:用准确率、运算量、模型参数作为衡量指标。MobileNet在ImageNet数据集上准确率比VGG 16少了0.9%,但是参数量少了很多。
- Table 6: α是卷积核个数的倍率,也就是控制卷积过程中卷积核的个数, α=1.0时,准确率为70.6%……卷积核个数减少了不少,但是模型参数减少了很多
- Table 7: β是分辨率参数,不同输入尺寸顿时网络准确率和模型计算量的对比……适当减少输入图像的大小,计算量大幅减少,但是准确率降低很少。
缺点:DW卷积在训练完后部分卷积核容易废掉,即卷积核参数大部分为0
MoblieNet V2网络
亮点:
- Inverted Residuals(倒残差结构)
- Linear Bottlenecks
残差结构比较:
ResNet的残差结构:通过11的卷积核降维(压缩),减少输入特征矩阵的channel,然后利用33的卷积核升维(扩充),增加channel
MobileNet的倒残差结构:先用11的卷积核进行升维操作,将channel边得更深,通过33的DW卷积操作进行卷积,再利用1*1的卷积核进行降维
倒残差结构实现用卷积核升维,在用卷积核降维,与残差结构是相反的。
激活函数不同:倒残差结构的记过函数为ReLu6。
- d图的倒残差网络结构:通过11的卷积,ReLu6激活,然后通过33的DW卷积,ReLu6进行激活,最后通过1*1的卷积,线性激活。
- 对应table 1给出的每一层信息,每一层输入特征矩阵的高宽深hwk,11卷积核进行升维处理,optput里面的t是扩展因子,表示11的卷积核的个数是tk个,输出特征矩阵的深度就是tk。第二层输入等于第一层的输出,经过33的DW卷积核,部长为s,输出矩阵的深度和输入矩阵深度相同;第三层,采用11的卷积核降维,使用k‘个卷积核。
另外,当stride=1且输入特征矩阵与输出特征矩阵shape相同才有shortcut连接。
MobileNet V2的网络结构:
t:扩展因子,是上一部分讲的1*1的卷积核的个数
一个block由一系列bottleneck组成
如表中第三行,n=2,s=2,表示bottleneck需要重复2次,第一层的bottleneck步距为2,第二层的bottleneck步距为1
例子:141464那行
n=3,表示有3层bottleneck,第一层满足stride=1,但是不会有shortcut连接,因为输入是64维,二输出是96维;第二层stride为1,输入特征矩阵和输出特征矩阵的深度相等,都是96,stride=1,特征矩阵的高宽不变,所以第二层bottleneck的输入特征矩阵和输出特征矩阵的shape是一样的,此时,才能使用shortcut。
最后一行,conv2d卷积层,其实就是全连接层,因为输出为111280,1*1如果不看,就是一维向量,卷积层和全连接层功能一样,k为分类类别数。
性能对比:分类任务和目标检测任务
MobileNet V3
亮点:
- 更新了Block(bneck)
- 使用NAS搜索参数(Neural Architecture Search)
- 重新设计耗时层结构
更准确、更高效
更新了Block(bneck)
加入了SE模块(SE是注意力机制模块)
如下半部分所示,就是将特征图进行池化,假设7732的特征图,池化成1132的向量,然后经过第一个全连接层缩减到118,然后经过第二个全连接层复原得到1132。
最后得到了0.5、0.6,然后用原来的特征图和这两个数据相乘,也就是把0.5和0.6当场了channel对应的权重(这里可以理解为对特征矩阵每一个channel分析出一个权重关系,比较重要的channel九赋予一个比较大的权重e)。
重新设计耗时层结构
关于重新设计耗时层结构,原论文主要讲了两个部分。首先是针对第一层卷积层,因为卷积核比较大,所以将第一层卷积核个数从 32 减少到 16。作者通过实验发现,这样做其实准确率并没有改变,但是参数量小了呀,有节省大概 2ms 的时间!
第二个则是精简 Last Stage。作者在使用过程中发现原始的最后结构比较耗时。精简之后第一个卷积没有变化,紧接着直接进行平均池化操作,再跟两个卷积层。和原来比起来明显少了很多层结构。作者通过实验发现这样做正确率基本没有损失,但是速度快了很多,节省了 7ms 的推理时间,别看 7ms 少,它占据了全部推理时间的 11%。
重新设计了激活函数
h-swish 的激活函数:便于提高网络准确率和求导。
注意,h-swish 实现虽然说比 swish 快,但和 ReLU 比还是慢不少。