美文网首页
MobileNet V1-V2

MobileNet V1-V2

作者: zelda2333 | 来源:发表于2021-04-26 20:36 被阅读0次

论文原文:

从模型结构上主要对以下几点做了研究:

  • V1:深度可分离卷积
    使用的Depthwise Separable Convolution是模型压缩的一个最为经典的策略,它是通过将跨通道的 3*3 卷积换成单通道的 1*1 卷积+跨通道的3*3 卷积来达到此目的的

  • V2:倒置残差块 和 线性瓶颈层
    在v1的Depthwise Separable的基础上引入了残差结构。并发现了ReLU的在通道数较少的Feature Map上有非常严重信息损失问题,由此引入了Linear Bottlenecks和Inverted Residual。

  • V3:网络架构搜索
    V3主要是在用NAS搜索结构,使用V2+SENet+swish的基本模块构建网络。

V1和V2都是先提出了一种理论、假说、发现,然后根据这种理论来指导模型的设计,这是有一定启发意义的。V3主要是在用NAS搜索结构,使用V2+SENet+swish的基本模块构建网络,设计思路上并没有很大的启发。

1. MobileNet v1

采用类似ResNext里面的group操作来实现。这种新的结构可以在基本不影响准确率的前提下大大减少计算时间(约为原来的1/9)和参数数量(约为原来的1/7)

深度可分离卷积是将标准卷积分解成深度卷积1x1点向卷积的卷积结构。深度卷积对每个输入通道都使用一个单一的卷积核,点向卷积就将深度卷积的输出组合起来。一个标准的卷积在一步内做了上面2件事情,而深度可分离卷积将它们分成两步。这种分解显著的减小了模型的计算量和大小。其示意图如下所示。

标准卷积 深度卷积 点向卷积

一个标准的卷积层接受 D_F \times D_F \times M 的特征图 F,产生一个 D_F \times D_F \times N 的特征图 G,其中 D_F 是正方形输入特征的宽和高, M是输入通道,N是输出通道,其卷积核参数有 D_K \times D_K \times M \times N 个,其中 D_K的卷积核大小,其计算量为:
D_K \times D_K \times M \times N \times D_F \times D_F

MobileNet模型处理了这些项及其相互作用。它使用深度可分解卷积来打破输出通道数与内核大小之间的相互作用。标准卷积用卷积和组合产生新特征。卷积和组合的步骤可以通过使用深度可分卷积分成两步,从而大大降低了计算成本。其计算量可以定义为:
D_K \times D_K \times 1 \times M \times D_F \times D_F

深度卷积相对于标准卷积是极其高效的,它只是对输入通道做了卷积,没有结合到一起,所以后续需要一个1x1的点向卷积将这些特征线性组合到一起从而组成一个新特征。
点向卷积计算量可以定义为:
1 \times1 \times M \times N \times D_F \times D_F

这整个步骤的计算量可以定义为:
D_K \times D_K \times M \times D_F \times D_F + M \times N \times D_F \times D_F

可分离卷积和标准卷积的相对比例是:


MobileNet使用3x3的深度可分离卷积比标准卷积的运算量减小了8到9倍。

在MobileNet中,每个层后面都接上了BN,除了最后一个全连接层接的Softmax之外,其他都接了ReLU。整个网络共有28层。对网络加上L2正则化很重要,因为深度可分离卷积的参数太少了。

宽度乘子:更瘦的模型
尽管基本的MobileNet体系结构已经很小并且延迟很短,但是很多情况下,特定的用例或应用程序可能要求模型变得更小,更快。为了构造这种模型,引入了一个非常简单的参数\alpha ,称为宽度乘子。宽度乘子的作用是使每一层的网络均匀地变薄。

对于给定的层和宽度乘子\alpha ,输入通道数M可以改为\alpha M 输出的通道数N改成 \alpha N ,计算量相应改为:
D_K \cdot D_K \cdot \alpha M \cdot D_F \cdot D_F + \alpha M \cdot \alpha N \cdot D_F \cdot D_F

\alpha \in (0,1] 时,通常设定为1,0.75,0.5,0.25,可以对网络做有效的计算量缩减。

分辨率乘子:减小特征
第二个减小计算量的超参数是分辨率乘子 \rho ,通过将输入图片乘以乘子,可以减小计算量。所以带有两个乘子的深度可分离卷积的计算量可以定义为:
D_K \cdot D_K \cdot \alpha M \cdot \rho D_F \cdot \rho D_F + \alpha M \cdot \alpha N \cdot \rho D_F \cdot \rho D_F

class Block(nn.Module):
    '''Depthwise conv + Pointwise conv'''
    def __init__(self, in_planes, out_planes, stride=1):
        super(Block, self).__init__()
        self.conv1 = nn.Conv2d\
            (in_planes, in_planes, kernel_size=3, stride=stride, 
             padding=1, groups=in_planes, bias=False)
        self.bn1 = nn.BatchNorm2d(in_planes)
        self.conv2 = nn.Conv2d\
            (in_planes, out_planes, kernel_size=1, 
            stride=1, padding=0, bias=False)
        self.bn2 = nn.BatchNorm2d(out_planes)

    def forward(self, x):
        out = F.relu(self.bn1(self.conv1(x)))
        out = F.relu(self.bn2(self.conv2(out)))
        return out

2. MobileNet v2

这篇论文的主要贡献是一个新的模块:具有线性bottleneck的倒置残差层。该模块以一个低维的压缩特征作为输入,首先被扩展到高维,然后用一个轻量级的深度卷积过滤。特征随后用线性卷积投影回低维表示。

此外,该卷积模块特别适合于移动设备设计,因为它可以通过从未完全实现大型中间张量来显着减少推理过程中所需的内存占用。 这减少了许多嵌入式硬件设计中对主存储器访问的需求,这些设计可提供少量非常快的软件控制的高速缓存。

V2的新想法包括Linear BottleneckInverted Residuals

Linear Bottleneck
在进行完卷积操作之后往往会接一层激活函数来增加特征的非线性性,一个最常见的激活函数便是ReLU。根据我们在残差网络中介绍的数据处理不等式(DPI),ReLU一定会带来信息损耗,而且这种损耗是没有办法恢复的,ReLU的信息损耗是当通道数非常少的时候更为明显。为什么这么说呢?我们看下图
6中这个例子,其输入是一个表示流形数据的矩阵,和卷机操作类似,他会经过 n 个ReLU的操作得到 n 个通道的Feature Map,然后我们试图通过这 n 个Feature Map还原输入数据,还原的越像说明信息损耗的越少。从图6中我们可以看出,当 n 的值比较小时,ReLU的信息损耗非常严重,但是当 n 的值比较大的时候,输入流形就能还原的很好了。

使用ReLU激活函数的通道数和信息损耗之间的关系

根据对上面提到的信息损耗问题分析,我们可以有两种解决方案:

  1. 既然是ReLU导致的信息损耗,那么我们就将ReLU替换成线性激活函数;
  2. 如果比较多的通道数能减少信息损耗,那么我们就使用更多的通道。

论文针对这个问题使用linear bottleneck(即不使用ReLU激活,做了线性变换)的来代替原本的非线性激活变换。到此,优化网络架构的思路也出来了:通过在卷积模块中后插入linear bottleneck来捕获兴趣流形。 实验证明,使用linear bottleneck可以防止非线性破坏太多信息。

从linear bottleneck到深度卷积之间的的维度比称为Expansion factor(扩展系数),该系数控制了整个block的通道数。
Inverted Residuals
MobileNetV2的网络模块样子是这样的:

我们是依据一个什么样的思路来设计这样的网络结构呢?

MobileNetV1网络主要思路就是深度可分离卷积的堆叠。在V2的网络设计中,我们除了继续使用深度可分离(中间那个)结构之外,还使用了Expansion layer和 Projection layer。这个projection layer也是使用 1x1 的网络结构,他的目的是希望把高维特征映射到低维空间去。另外说一句,使用 1x1 的网络结构将高维空间映射到低纬空间的设计有的时候我们也称之为Bottleneck layer。

Expansion layer的功能正相反,使用 1x1 的网络结构,目的是将低维空间映射到高维空间。这里Expansion有一个超参数是维度扩展几倍。可以根据实际情况来做调整的,默认值是6,也就是扩展6倍。

此图更详细的展示了整个模块的结构。我们输入是24维,最后输出也是24维。但这个过程中,我们扩展了6倍,然后应用深度可分离卷积进行处理。整个网络是中间胖,两头窄,像一个纺锤形。bottleneck residual block(ResNet论文中的)是中间窄两头胖,在MobileNetV2中正好反了过来,所以,在MobileNetV2的论文中我们称这样的网络结构为Inverted residuals。需要注意的是residual connection是在输入和输出的部分进行连接。另外,我们之前已经花了很大篇幅来讲Linear Bottleneck,因为从高维向低维转换,使用ReLU激活函数可能会造成信息丢失或破坏(不使用非线性激活数数)。所以在projection convolution这一部分,我们不再使用ReLU激活函数而是使用线性激活函数。

下面谈谈为什么要构造一个这样的网络结构。

我们知道,如果tensor维度越低,卷积层的乘法计算量就越小。那么如果整个网络都是低维的tensor,那么整体计算速度就会很快。

然而,如果只是使用低维的tensor效果并不会好。如果卷积层的过滤器都是使用低维的tensor来提取特征的话,那么就没有办法提取到整体的足够多的信息。所以,如果提取特征数据的话,我们可能更希望有高维的tensor来做这个事情。V2就设计这样一个结构来达到平衡。

先通过Expansion layer来扩展维度,之后在用深度可分离卷积来提取特征,之后使用Projection layer来压缩数据,让网络从新变小。因为Expansion layer 和 Projection layer都是有可以学习的参数,所以整个网络结构可以学习到如何更好的扩展数据和从新压缩数据。

参考链接:
MobileNet v1 和 MobileNet v2
MobileNet V1-V3 阅读笔记
详解MobileNetV2

相关文章

网友评论

      本文标题:MobileNet V1-V2

      本文链接:https://www.haomeiwen.com/subject/yhsjrltx.html