MobileNet 系列:从V1到V3

MobileNet 系列:从V1到V3

转自:轻量级神经网络“巡礼”(二)—— MobileNet,从V1到V3

自从2017年由谷歌公司提出,MobileNet可谓是轻量级网络中的Inception,经历了一代又一代的更新。成为了学习轻量级网络的必经之路。

MobileNet V1

其实介绍MobileNetV1(以下简称V1)只有一句话,MobileNetV1就是把VGG中的标准卷积层换成深度可分离卷积就可以了。

那么,这个深度可分离卷积是什么

深度可分离卷积

深度可分离卷积depthwise separable convolution),根据史料记载,可追溯到2012年的论文Simplifying ConvNets for Fast Learning,作者提出了可分离卷积的概念(下图(a)):

在这里插入图片描述

Laurent Sifre博士2013年在谷歌实习期间,将可分离卷积拓展到了深度(depth),并且在他的博士论文Rigid-motion scattering for image classification中有详细的描写,感兴趣的同学可以去看看论文

可分离卷积主要有两种类型:空间可分离卷积深度可分离卷积

空间可分离,顾名思义,空间可分离就是将一个大的卷积核变成两个小的卷积核,比如将一个 3×33\times 33×3 的核分成一个 3×13\times 13×1和一个 1×31\times 31×3 的核:

[123000246]=[102]×[123]\left[ \begin{matrix} 1 & 2 & 3\\ 0 & 0 & 0\\ 2 & 4 & 6\\ \end{matrix} \right] =\left[ \begin{matrix} 1 \\ 0 \\ 2 \\ \end{matrix} \right] \times \left[ \begin{matrix} 1 & 2 & 3\\ \end{matrix} \right] 102204306=102×[123]
由于空间可分离卷积不在MobileNet的范围内,就不说了。

深度可分离卷积就是将普通卷积拆分成为一个深度卷积和一个逐点卷积

标准卷积

我们先来看一下标准的卷积操作:

在这里插入图片描述

输入一个 12×12×312\times 12\times 312×12×3的一个输入特征图,经过 5×5×35\times 5\times 35×5×3的卷积核卷积得到一个 8×8×18\times 8\times 18×8×1 的输出特征图。如果此时我们有 256 个特征图,我们将会得到一个8×8×2568\times 8\times 2568×8×256 的输出特征图。

以上就是标准卷积所干的活。那深度卷积和逐点卷积呢?

深度卷积

在这里插入图片描述

与标准卷积网络不一样的是,我们将卷积核拆分成为但单通道形式,在不改变输入特征图像的深度的情况下,对每一通道进行卷积操作,这样就得到了和输入特征图通道数一致的输出特征图。如上图:输入 12×12×312\times 12\times 312×12×3 的特征图,经过 5×5×1×35\times 5\times 1\times 35×5×1×3 的深度卷积之后,得到了8×8×3的输出特征图。输入个输出的维度是不变的 3。这样就会有一个问题,通道数太少,特征图的维度太少,能获取到足够的有效信息吗?

逐点卷积

逐点卷积就是1×1卷积。主要作用就是对特征图进行升维和降维,如下图:

在这里插入图片描述

在深度卷积的过程中,我们得到了 8×8×38\times 8\times 38×8×3 的输出特征图,我们用 2562562561×1×31\times 1\times 31×1×3 的卷积核对输入特征图进行卷积操作,输出的特征图和标准的卷积操作一样都是 8×8×2568\times 8\times 2568×8×256 了。

标准卷积与深度可分离卷积的过程对比如下:

在这里插入图片描述

为什么要深度可分离卷积?

这个问题很好回答,如果有一个方法能让你用更少的参数,更少的运算,但是能达到差的不是很多的结果,你会使用吗?

深度可分离卷积就是这样的一个方法。我们首先来计算一下标准卷积的参数量与计算量(只考虑MAdd):

在这里插入图片描述

标准卷积/深度可分离卷积参数量/计算量对比

标准卷积的参数量

卷积核的尺寸是 Dk×Dk×MD_k\times D_k\times MDk×Dk×M,一共有 NNN 个,所以标准卷积的参数量是:
DK×DK×M×ND_K\times D_K\times M\times N DK×DK×M×N

标准卷积的计算量

卷积核的尺寸是 Dk×Dk×MD_k\times D_k\times MDk×Dk×M,一共有 NNN 个,每一个都要进行 DW×DHD_W\times D_HDW×DH 次运算,所以标准卷积的计算量是:
DK×DK×M×N×DW×DHD_K\times D_K\times M\times N\times D_W\times D_H DK×DK×M×N×DW×DH
标准卷积算完了,我们接下来计算深度可分离卷积的参数量和计算量

在这里插入图片描述

深度可分离卷积的参数量

深度可分离卷积的参数量深度卷积逐点卷积两部分组成:

深度卷积的卷积核尺寸 DK×DK×MD_K\times D_K\times MDK×DK×M逐点卷积的卷积核尺寸为 1×1×M1\times 1\times M1×1×M,一共有 NNN 个,所以深度可分离卷积的参数量是:
DK×DK×M+M×ND_K\times D_K\times M+M\times N DK×DK×M+M×N

深度可分离卷积的计算量

深度可分离卷积的计算量也是由深度卷积逐点卷积两部分组成:

深度卷积的卷积核尺寸 DK×DK×MD_K\times D_K\times MDK×DK×M,一共要做 DW×DHD_W\times D_HDW×DH次乘加运算;逐点卷积的卷积核尺寸为 1×1×M1\times 1\times M1×1×M,有 NNN 个,一共要做 DW×DHD_W\times D_HDW×DH次乘加运算,所以深度可分离卷积的计算量是:
DK×DK×M×DW×DH+M×N×DW×DHD_K\times D_K\times M\times D_W\times D_H+M\times N\times D_W\times D_H DK×DK×M×DW×DH+M×N×DW×DH

深度可分离卷积与标准卷积的参数量/计算量之比

参数量:
DK×DK×M+M×NDK×DK×M×N=1N+1DK2\frac{D_K\times D_K\times M+M\times N}{D_K\times D_K\times M\times N}=\frac{1}{N}+\frac{1}{D_K^2} DK×DK×M×NDK×DK×M+M×N=N1+DK21
计算量:
DK×DK×M×DW×DH+M×N×DW×DHDK×DK×M×N×DW×DH=1N+1DK2\frac{D_K\times D_K\times M\times D_W\times D_H+M\times N\times D_W\times D_H}{D_K\times D_K\times M\times N\times D_W\times D_H}=\frac{1}{N}+\frac{1}{D_K^2} DK×DK×M×N×DW×DHDK×DK×M×DW×DH+M×N×DW×DH=N1+DK21
可以看到参数数量和乘加操作的运算量均下降为原来的1N+1DK2\frac{1}{N}+\frac{1}{D_K^2}N1+DK21,我们通常所使用的是3×3的卷积核,也就是会下降到原来的九分之一到八分之一

V1卷积层

在这里插入图片描述

上图左边是标准卷积层,右边是V1的卷积层,虚线处是不相同点。V1的卷积层,首先使用3×3的深度卷积提取特征,接着是一个BN层,随后是一个ReLU层,在之后就会逐点卷积,最后就是BN和ReLU了。这也很符合深度可分离卷积,将左边的标准卷积拆分成右边的一个深度卷积和一个逐点卷积

等等,我们发现有什么东西混了进来???ReLU6是什么?

ReLU6

在这里插入图片描述

上图左边是普通的ReLU,对于大于0的值不进行处理,右边是ReLU6,当输入的值大于6的时候,返回6,relu6“具有一个边界”。作者认为ReLU6作为非线性激活函数,在低精度计算下具有更强的鲁棒性。(这里所说的“低精度”,我看到有人说不是指的float16,而是指的定点运算(fixed-point arithmetic))

现在就有一个问题,标准卷积核深度可分离卷积层到底对结果有什么样的影响呢?

上实验。

在这里插入图片描述

可以看到使用深度可分离卷积与标准卷积,参数和计算量能下降为后者的九分之一到八分之一左右。但是准确率只有下降极小的1%

V1网络结构

在这里插入图片描述

MobileNet的网络结构如上图所示。首先是一个 3×33\times 33×3 的标准卷积,s2进行下采样。然后就是堆积深度可分离卷积,并且其中的部分深度卷积会利用s2进行下采样。然后采用平均池化层将feature变成 1×11\times 11×1,根据预测类别大小加上全连接层,最后是一个softmax层。整个网络有28层,其中深度卷积层有13层。

实验结果

分类、检测、分割定量结果略。

MobileNet V2

MobileNetV2: Inverted Residuals and Linear Bottlenecks 论文地址:https://arxiv.org/abs/1704.04861 收录:CVPR2018

MobileNetV1(以下简称:V1)过后,我们就要讨论讨论MobileNetV2(以下简称:V2)了。为了能更好地讨论V2,我们首先再回顾一下V1:

回顾MobileNet V1

V1核心思想是采用 深度可分离卷积 操作。在相同的权值参数数量的情况下,相较标准卷积操作,可以减少数倍的计算量,从而达到提升网络运算速度的目的。

V1的block如下图所示:

在这里插入图片描述

首先利用 3×33\times 33×3 的深度可分离卷积提取特征,然后利用 1×11\times 11×1 的卷积来扩张通道。用这样的block堆叠起来的MobileNetV1既能较少不小的参数量、计算量,提高网络运算速度,又能的得到一个接近于标准卷积的还不错的结果,看起来是很美好的。

但是!

有人在实际使用的时候, 发现深度卷积部分的卷积核比较容易训废掉:训完之后发现深度卷积训出来的卷积核有不少是空的:

在这里插入图片描述

这是为什么?

作者认为这是ReLU这个浓眉大眼的激活函数的锅。(没想到你个浓眉大眼的ReLU激活函数也叛变革命了???)

ReLU做了些啥?

V2的论文中,作者也有这样的一个解释。(论文中的实在不是很好懂,我就根据一些解读结合我的想法简单说说吧。有说的不正确的地方,还请各位大佬指出,感谢!)

这是将低维流形的ReLU变换embedded到高维空间中的的例子。

在这里插入图片描述

我们在这里抛弃掉流形这个概念,通俗理解一下。

假设在2维空间有一组由 mmm 个点组成的螺旋线 XmX_mXm 数据(如input),利用随机矩阵 TTT 映射到 nnn 维空间上并进行ReLU运算,即:
y=ReLU(T⋅Xm)y=ReLU(T\cdot X_m) y=ReLU(TXm)
其中,XmX_mXm 被随机矩阵T映射到了 nnn 维空间(T⋅XmT\cdot X_mTXm),再利用随机矩阵 TTT 的逆矩阵 T−1T^{-1}T1,将 yyy 映射回2维空间当中:
Xm′=T−1⋅yX'_m=T^{-1}\cdot y Xm=T1y
全过程如下表示:
Xm′=T−1⋅ReLU(T⋅Xm)X'_m=T^{-1}\cdot ReLU(T\cdot X_m) Xm=T1ReLU(TXm)
换句话说,就是对一个 nnn 维空间中的一个“东西”做ReLU运算,然后(利用T的逆矩阵 T−1T^{-1}T1恢复)对比ReLU之后的结果与Input的结果相差有多大

在这里插入图片描述

可以看到:

n=2,3n = 2,3n=2,3 时,与Input相比有很大一部分的信息已经丢失了。而当 n=15n = 15n=15303030 ,还是有相当多的地方被保留了下来。

也就是说,对低维度做ReLU运算,很容易造成信息的丢失。而在高维度进行ReLU运算的话,信息的丢失则会很少。

这就解释了为什么深度卷积的卷积核有不少是空。发现了问题,我们就能更好地解决问题。针对这个问题,可以这样解决:既然是ReLU导致的信息损耗,将ReLU替换成线性激活函数

Linear bottleneck

我们当然不能把所有的激活层都换成线性的啊,所以我们就悄咪咪的把最后的那个ReLU6换成Linear。(至于为什么换最后一个ReLU6而不换第一个和第二个ReLU6,看到后面就知道了。

在这里插入图片描述

Separable with linear bottleneck

作者将这个部分称之为linear bottleneck。对,就是论文名中的那个linear bottleneck。

Expansion layer

现在还有个问题是,深度卷积本身没有改变通道的能力,来的是多少通道输出就是多少通道。如果来的通道很少的话,DW深度卷积只能在低维度上工作,这样效果并不会很好,所以我们要“扩张”通道。既然我们已经知道PW逐点卷积也就是1×1卷积可以用来升维和降维,那就可以在DW深度卷积之前使用PW卷积进行升维(升维倍数为t,t=6),再在一个更高维的空间中进行卷积操作来提取特征

在这里插入图片描述

也就是说,不管输入通道数是多少,经过第一个PW逐点卷积升维之后,深度卷积都是在相对的更高6倍维度上进行工作。

在这里插入图片描述

Inverted residuals

回顾V1的网络结构,我们发现V1很像是一个直筒型的VGG网络。我们想像 ResNet 一样复用我们的特征,所以我们引入了shortcut结构,这样V2的block就是如下图形式:

在这里插入图片描述

对比一下 ResNet 和 V2:

在这里插入图片描述

可以发现,都采用了 1×1 -> 3 ×3 -> 1 × 1 的模式,以及都使用Shortcut结构。但是不同点呢:

  • ResNet 先降维 (0.25倍)、卷积、再升维。
  • MobileNetV2 则是 先升维 (6倍)、卷积、再降维。

刚好V2的block刚好与Resnet的block相反,作者将其命名为Inverted residuals。就是论文名中的Inverted residuals

V2的block

至此,V2的最大的创新点就结束了,我们再总结一下V2的block:

在这里插入图片描述

我们将V1和V2的block进行一下对比:

在这里插入图片描述

左边是v1的block,没有Shortcut并且带最后的ReLU6。

右边是v2的加入了1×1升维,引入Shortcut并且去掉了最后的ReLU,改为Linear。步长为1时,先进行1×1卷积升维,再进行深度卷积提取特征,再通过Linear的逐点卷积降维。将input与output相加,形成残差结构。步长为2时,因为input与output的尺寸不符,因此不添加shortcut结构,其余均一致。

V2的网络结构

在这里插入图片描述

28×28×32那一层的步长为2的话,输出应该是14×14,应该是一处错误。按照作者论文里的说法,自己修改了一下:

在这里插入图片描述

实验结果

分类、检测、分割定量实验略。

V1 VS V2

在这里插入图片描述

可以看到,虽然V2的层数比V1的要多很多,但是FLOPs,参数以及CPU耗时都是比V1要好的。

V1V2在google Pixel 1手机上在Image Classification任务的对比:

在这里插入图片描述

MobileNetV2 模型在整体速度范围内可以更快实现相同的准确性。

目标检测和语义分割的结果:

在这里插入图片描述

综上,MobileNetV2 提供了一个非常高效的面向移动设备的模型,可以用作许多视觉识别任务的基础

但是!

在我实际应用V1V2时,V1的效果都要稍微好一点。上一张gluonCV的结果图,和我的实现也差不多:

在这里插入图片描述

不知道为什么。

MobileNet V3

V1,V2都看完了,现在就来到了MobileNetV3(以下简称V3)。

Searching for MobileNetV3 论文地址:https://arxiv.org/pdf/1905.02244.pdf

MobileNetV3,是谷歌在2019年3月21日提出的网络架构。首先,引入眼帘的是这篇文章的标题,“searching”一词就把V3的论文的核心观点展示了出来——用**神经结构搜索(NAS)**来完成V3。虽然本人没有接触过NAS,但是我已经闻到了金钱的味道。

“抱歉,有钱真的可以为…”

由于真的没有接触过NAS,所以V3就讲讲其他的,除NAS之外的东西吧。

先上结果:

在这里插入图片描述

可以看到,在同一大小的计算量下,V3在ImageNet上的结果都是最好的。

我们先来看看V3做了什么?

MobileNetV3的相关技术

  • 0.网络的架构基于NAS实现的MnasNet(效果比MobileNetV2好)
  • 1.引入MobileNetV1的深度可分离卷积
  • 2.引入MobileNetV2的具有线性瓶颈的倒残差结构
  • 3.引入基于squeeze and excitation结构的轻量级注意力模型(SE)
  • 4.使用了一种新的激活函数h-swish(x)
  • 5.网络结构搜索中,结合两种技术:资源受限的NAS(platform-aware NAS)与NetAdapt
  • 6.修改了MobileNetV2网络端部最后阶段

第0点,关于MnasNet也是基于NAS的,也不是很了解。大家感兴趣的话,可以参考曲晓峰老师的这个回答如何评价 Google 最新的模型 MnasNet? - 曲晓峰的回答 - 知乎,写的很棒!所以我们只要认为MnasNet是一个比MobileNet精度和实时性更高的模型就行了。

第1,2点在前面的MobileNetV1和V2上有讨论,在这里就不赘述了。

第3点引入SE模块,主要为了利用结合特征通道的关系来加强网络的学习能力。先不仔细讨论,之后在【深度回顾经典网络】系列的时候再详细讨论吧,感兴趣的同学,可以看看这一篇文章。

激活函数h-swish

swish

h-swish是基于swish的改进,swish最早是在谷歌大脑2017的论文Searching for Activation functions所提出(又是Searching for!!!)。

在这里插入图片描述

swish论文的作者认为,Swish具备无上界有下界、平滑、非单调的特性。并且Swish在深层模型上的效果优于ReLU。仅仅使用Swish单元替换ReLU就能把MobileNet,NASNetA在 ImageNet上的top-1分类准确率提高0.9%,Inception-ResNet-v的分类准确率提高0.6%。

V3也利用swish当作为ReLU的替代时,它可以显著提高神经网络的精度。但是呢,作者认为这种非线性激活函数虽然提高了精度,但在嵌入式环境中,是有不少的成本的。原因就是在移动设备上计算sigmoid函数是非常明智的选择。所以提出了h-swish。

h-swish

可以用一个近似函数来逼急这个swish,让swish变得硬(hard)。作者选择的是基于ReLU6,作者认为几乎所有的软件和硬件框架上都可以使用ReLU6的优化实现。其次,它能在特定模式下消除了由于近似sigmoid的不同实现而带来的潜在的数值精度损失。

在这里插入图片描述

下图是Sigmoid和swish的hard、soft形式:

在这里插入图片描述

我们可以简单的认为,hard形式是soft形式的低精度化。作者认为swish的表现和其他非线性相比,能够将过滤器的数量减少到16个的同时保持与使用ReLU或swish的32个过滤器相同的精度,这节省了3毫秒的时间和1000万MAdds的计算量。

并且同时,作者认为随着网络的深入,应用非线性激活函数的成本会降低,能够更好的减少参数量。作者发现swish的大多数好处都是通过在更深的层中使用它们实现的。因此,在V3的架构中,只在模型的后半部分使用h-swish(HS)

网络结构搜索NAS

由于不熟,就简单写一点吧。

主要结合两种技术:资源受限的NAS(platform-aware NAS)NetAdapt

资源受限的NAS,用于在计算和参数量受限的前提下搜索网络来优化各个块(block),所以称之为模块级搜索(Block-wise Search)

NetAdapt,用于对各个模块确定之后网络层的微调每一层的卷积核数量,所以称之为层级搜索(Layer-wise Search)

一旦通过体系结构搜索找到模型,我们就会发现最后一些层以及一些早期层计算代价比较高昂。于是作者决定对这些架构进行一些修改,以减少这些慢层(slow layers)的延迟,同时保持准确性。这些修改显然超出了当前搜索的范围。

对V2最后阶段的修改

作者认为,当前模型是基于V2模型中的倒残差结构和相应的变体(如下图)。使用1×1卷积来构建最后层,这样可以便于拓展到更高维的特征空间。这样做的好处是,在预测时,有更多更丰富的特征来满足预测,但是同时也引入了额外的计算成本与延时

在这里插入图片描述

所以,需要改进的地方就是要保留高维特征的前提下减小延时。首先,还是将1×1层放在到最终平均池之后。这样的话最后一组特征现在不是7x7(下图V2结构红框),而是以1x1计算(下图V3结构黄框)。

在这里插入图片描述

在这里插入图片描述

这样的好处是,在计算和延迟方面,特征的计算几乎是免费的。最终,重新设计完的结构如下:

在这里插入图片描述

在不会造成精度损失的同时,减少10ms耗时,提速15%,减小了30m的MAdd操作。

V3的block

综合以上,V3的block结构如下所示:

在这里插入图片描述

与V2的block相比较:
在这里插入图片描述

MobileNetV3的网络结构

MobileNetV3定义了两个模型: MobileNetV3-LargeMobileNetV3-Small。V3-Large是针对高资源情况下的使用,相应的,V3-small就是针对低资源情况下的使用。两者都是基于之前的简单讨论的NAS。

MobileNetV3-Large

在这里插入图片描述

MobileNetV3-Small

在这里插入图片描述

就像之前所说的:只有在更深层次使用h-swish才能得到比较大的好处。所以在上面的网络模型中,不论大小,作者只在模型的后半部分使用h-swish。

用谷歌pixel 1/2/3来对大小V3进行测试的结果。

在这里插入图片描述

实验结果

分类、检测、分割定量结果略。

为什么MobileNet会这么快?

在写这篇文章的时候看到了一篇文章Why MobileNet and Its Variants (e.g. ShuffleNet) Are Fast?,这也让我有了一样的一个问题,这篇文章主要是从结构方面进行了讨论,从深度可分离卷积到组卷积的参数计算量等,因为之前的文章都有写过,在这里就不赘述了,感兴趣的同学可以翻阅下之前的文章。

在这里换一个的角度。我们直接从用时多少的角度去讨论下这个问题。

下图来自Caffe作者贾扬清的博士论文:

在这里插入图片描述

该图是AlexNet网络中不同层的GPU和CPU的时间消耗,我们可以清晰的看到,不管是在GPU还是在CPU运行,最重要的“耗时杀手”就是conv,卷积层。也就是说,想要提高网络的运行速度,就得到提高卷积层的计算效率

我们以MobileNetV1为主,看看MobileNet的资源分布情况:

在这里插入图片描述

可以看到,MobileNet的95%的计算都花费在了1×1的卷积上,那1×1卷积有什么好处吗?

我们都知道,卷积操作就是如下图所示的乘加运算:

在这里插入图片描述

在计算机操作时,需要将其存入内存当中再操作(按照“行先序”):

在这里插入图片描述

这样一来,特征图y11,y12,y21,y22的计算如下所示:

在这里插入图片描述

按照卷积计算,实线标注出卷积计算中的访存过程(对应数据相乘),我们可以看到这一过程是非常散乱和混乱的。直接用卷积的计算方式是比较愚蠢的。

这时候就要用到im2col操作。

im2col

一句话来介绍im2col操作的话,就是通过牺牲空间的手段(约扩增K×K倍),将特征图转换成庞大的矩阵来进行卷积计算

在这里插入图片描述

其实思路非常简单:

把每一次循环所需要的数据都排列成列向量,然后逐一堆叠起来形成矩阵(按通道顺序在列方向上拼接矩阵)。比如Ci×Wi×Hi大小的输入特征图,K×K大小的卷积核,输出大小为Co×Wo×Ho,输入特征图将按需求被转换成(K∗K)×(Ci∗Wo∗Ho)的矩阵,卷积核将被转换成Co×(K∗K)的矩阵,

在这里插入图片描述

然后调用GEMM(矩阵乘矩阵)库加速两矩阵相乘也就完成了卷积计算。由于按照计算需求排布了数据顺序,每次计算过程中总是能够依次访问特征图数据,极大地提高了计算卷积的速度。 (不光有GEMM,还有FFT(快速傅氏变换))

在这里插入图片描述

换一种表示方法能更好地理解,图片来自High Performance Convolutional Neural Networks for Document Processing:

在这里插入图片描述

这样可以更清楚的看到卷积的定义进行卷积操作(上图上半部分),内存访问会非常不规律,以至于性能会非常糟糕。而Im2col()以一种内存访问规则的方式排列数据虽然Im2col操作增加了很多数据冗余,但使用Gemm的性能优势超过了这个数据冗余的劣势

所以标准卷积运算大概就是这样的一个过程:

在这里插入图片描述

那我们现在回到1×1的卷积上来,有点特殊。按照我们之前所说的,1×1的卷积的原始储存结构和进行im2col的结构如下图所示:

在这里插入图片描述

可以看到矩阵是完全相同的。标准卷积运算和1×1卷积运算对比如下图:

在这里插入图片描述

也就是说,1x1卷积不需要im2col的过程,所以底层可以有更快的实现,拿起来就能直接算,大大节省了数据重排列的时间和空间。

当然,这些也不是那么绝对的,因为毕竟MobileNet速度快不快,与CONV1x1运算的优化程度密切相关。如果使用了定制化的硬件(比如用FPGA直接实现3x3的卷积运算单元),那么im2col就失去了意义而且反而增加了开销。

回到之前的MobileNet的资源分布,95%的1×1卷积和优化的网络结构就是MobileNet能如此快的原因了。

在这里插入图片描述

Reference

MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications

MobileNetV2: Inverted Residuals and Linear Bottlenecks

Searching for MobileNetV3

Xception: Deep Learning with Depthwise Separable Convolutions

Simplifying ConvNets for Fast Learning

a-basic-introduction-to-separable-convolution

CNN模型之MobileNet

网络解析(二):MoblieNets详解

轻量级网络–MobileNet论文解读

https://mp.weixin.qq.com/s/O2Bhn66cWCN_87P52jj8hQ

http://machinethink.net/blog/mobilenet-v2/

如何评价 Google 最新的模型 MnasNet? - 曲晓峰的回答 - 知乎

Learning Semantic Image Representations at a Large Scale 贾扬清博士论文

im2col的原理和实现

在 Caffe 中如何计算卷积? - 贾扬清的回答 - 知乎

漫谈卷积层

High Performance Convolutional Neural Networks for Document Processing

Why MobileNet and Its Variants (e.g. ShuffleNet) Are Fast

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/532387.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql 高级知识点_这是我见过最全的《MySQL笔记》,涵盖MySQL所有高级知识点!...

作为运维和编程人员,对MySQL一定不会陌生,尤其是互联网行业,对MySQL的使用是比较多的。MySQL 作为主流的数据库,是各大厂面试官百问不厌的知识点,但是需要了解到什么程度呢?仅仅停留在 建库、创表、增删查改…

teechart mysql_TeeChart 的应用

TeeChart 是一个很棒的绘图控件,不过由于里面没有注释,网上相关的资料也很少,所以在应用的时候只能是一点点的试。为了防止以后用到的时候忘记,我就把自己用到的东西都记录下来,以便以后使用的时候查询。1、进制缩放图…

NLP新宠——浅谈Prompt的前世今生

NLP新宠——浅谈Prompt的前世今生 转自:NLP新宠——浅谈Prompt的前世今生 作者:闵映乾,中国人民大学信息学院硕士,目前研究方向为自然语言处理。 《Pre-train, Prompt, and Predict: A Systematic Survey of Prompting Methods in…

requestfacade 这个是什么类?_Java 的大 Class 到底是什么?

作者在之前工作中,面试过很多求职者,发现有很多面试者对Java的 Class 搞不明白,理解的不到位,一知半解,一到用的时候,就不太会用。想写一篇关于Java Class 的文章,没有那么多专业名词&#xff0…

初学机器学习:直观解读KL散度的数学概念

初学机器学习:直观解读KL散度的数学概念 转自:初学机器学习:直观解读KL散度的数学概念 译自:https://towardsdatascience.com/light-on-math-machine-learning-intuitive-guide-to-understanding-kl-divergence-2b382ca2b2a8 解读…

MySQL应用安装_mysql安装和应用

1.下载mysql安装包2.安装mysql,自定义->修改路径3.配置mysql,选择自定义->server模式->500访问量->勾选控制台->设置gbk->设置密码和允许root用户远程登录等等。以管理员权限,在控制台输入:net start MySQL, 启…

mysql 商品规格表_商品规格分析

产品表每次更新商品都会变动的,ID不能用,可是购物车还是用了,这就导致每次保存商品,哪怕什么都没有改动,也会导致用户的购物车失效。~~~其实可以考虑不是每次更新商品就除所有的SKU,毕竟有时什么都没修改呢…

huggingface NLP工具包教程1:Transformers模型

huggingface NLP工具包教程1:Transformers模型 原文:TRANSFORMER MODELS 本课程会通过 Hugging Face 生态系统中的一些工具包,包括 Transformers, Datasets, Tokenizers, Accelerate 和 Hugging Face Hub。…

隐马尔可夫模型HMM推导

隐马尔可夫模型HMM推导 机器学习-白板推导系列(十四)-隐马尔可夫模型HMM(Hidden Markov Model) 课程笔记 背景介绍 介绍一下频率派和贝叶斯派两大流派发展出的建模方式。 频率派 频率派逐渐发展成了统计机器学习,该流派通常将任务建模为一…

使用randomaccessfile类将一个文本文件中的内容逆序输出_Java 中比较常用的知识点:I/O 总结...

Java中I/O操作主要是指使用Java进行输入,输出操作. Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列。数据流是一串连续不断的数据的集合,就象水管里的水流,在水管的一端一点一点地供水…

huggingface NLP工具包教程2:使用Transformers

huggingface NLP工具包教程2:使用Transformers 引言 Transformer 模型通常非常大,由于有数百万到数百亿个参数,训练和部署这些模型是一项复杂的任务。此外,由于几乎每天都有新模型发布,而且每个模型都有自己的实现&a…

mysql精讲_Mysql 索引精讲

开门见山,直接上图,下面的思维导图即是现在要讲的内容,可以先有个印象~常见索引类型(实现层面)索引种类(应用层面)聚簇索引与非聚簇索引覆盖索引最佳索引使用策略1.常见索引类型(实现层面)首先不谈Mysql怎么实现索引的,先马后炮一…

RT-Smart 官方 ARM 32 平台 musl gcc 工具链下载

前言 RT-Smart 的开发离不开 musl gcc 工具链,用于编译 RT-Smart 内核与用户态应用程序 RT-Smart musl gcc 工具链代码当前未开源,但可以下载到 RT-Thread 官方编译好的最新的 musl gcc 工具链 ARM 32位 平台 比如 RT-Smart 最好用的 ARM32 位 qemu 平…

OpenAI Whisper论文笔记

OpenAI Whisper论文笔记 OpenAI 收集了 68 万小时的有标签的语音数据,通过多任务、多语言的方式训练了一个 seq2seq (语音到文本)的 Transformer 模型,自动语音识别(ASR)能力达到商用水准。本文为李沐老师…

【经典简读】知识蒸馏(Knowledge Distillation) 经典之作

【经典简读】知识蒸馏(Knowledge Distillation) 经典之作 转自:【经典简读】知识蒸馏(Knowledge Distillation) 经典之作 作者:潘小小 知识蒸馏是一种模型压缩方法,是一种基于“教师-学生网络思想”的训练方法,由于其简单&#xf…

深度学习三大谜团:集成、知识蒸馏和自蒸馏

深度学习三大谜团:集成、知识蒸馏和自蒸馏 转自:https://mp.weixin.qq.com/s/DdgjJ-j6jHHleGtq8DlNSA 原文(英):https://www.microsoft.com/en-us/research/blog/three-mysteries-in-deep-learning-ensemble-knowledge…

在墙上找垂直线_墙上如何快速找水平线

在装修房子的时候,墙面的面积一般都很大,所以在施工的时候要找准水平线很重要,那么一般施工人员是如何在墙上快速找水平线的呢?今天小编就来告诉大家几种找水平线的方法。一、如何快速找水平线1、用一根透明的软管,长度…

Vision Transformer(ViT)PyTorch代码全解析(附图解)

Vision Transformer(ViT)PyTorch代码全解析 最近CV领域的Vision Transformer将在NLP领域的Transormer结果借鉴过来,屠杀了各大CV榜单。本文将根据最原始的Vision Transformer论文,及其PyTorch实现,将整个ViT的代码做一…

Linux下的ELF文件、链接、加载与库(含大量图文解析及例程)

Linux下的ELF文件、链接、加载与库 链接是将将各种代码和数据片段收集并组合为一个单一文件的过程,这个文件可以被加载到内存并执行。链接可以执行与编译时,也就是在源代码被翻译成机器代码时;也可以执行于加载时,也就是被加载器加…

java 按钮 监听_Button的四种监听方式

Button按钮设置点击的四种监听方式注:加粗放大的都是改变的代码1.使用匿名内部类的形式进行设置使用匿名内部类的形式,直接将需要设置的onClickListener接口对象初始化,内部的onClick方法会在按钮被点击的时候执行第一个活动的java代码&#…