ShuffleNet V2:高效卷积神经网络架构设计的实用指南
摘要
https://arxiv.org/pdf/1807.11164
当前,神经网络架构设计大多以计算复杂度的间接指标,即浮点运算数(FLOPs)为指导。然而,直接指标(例如速度)还取决于其他因素,如内存访问成本和平台特性。因此,本文提出在目标平台上评估直接指标,而不仅仅是考虑FLOPs。基于一系列对照实验,本文得出了一些高效网络设计的实用指南。据此,提出了一种新的架构,称为ShuffleNet V2。全面的消融实验验证了我们的模型在速度和准确性的权衡方面达到了最先进的水平。
关键词:卷积神经网络(CNN)架构设计,效率,实用
1 引言
深度卷积神经网络(CNN)的架构多年来不断演进,变得更加准确和快速。自AlexNet [1]这一里程碑性工作以来,ImageNet分类准确性通过新型结构(包括VGG [2]、GoogLeNet [3]、ResNet [4,5]、DenseNet [6]、ResNeXt [7]、SE-Net [8]和自动神经网络架构搜索 [9,10,11]等)得到了显著提升。
除了准确性之外,计算复杂度是另一个重要考虑因素。现实世界中的任务通常旨在在目标平台(例如硬件)和应用场景(例如自动驾驶需要低延迟)提供的有限计算预算下获得最佳准确性。这促使了一系列工作朝着轻量级架构设计以及更好的速度和准确性权衡方向发展,包括Xception [12]、MobileNet [13]、MobileNet V2 [14]、ShuffleNet [15]和CondenseNet [16]等。在这些工作中,组卷积和深度卷积至关重要。
为了衡量计算复杂度,一个广泛使用的指标是浮点运算数(FLOPs){ }^{1} 。然而,FLOPs是一个间接指标。它是我们真正关心的直接指标(如速度或延迟)的近似值,但通常并不等价。这种差异已在先前的工作 [17,18,14,19] 中被注意到。例如,MobileNet v2 [14]比NASNET-A [9]快得多,但它们的FLOPs相当。这一现象在图1©(d)中得到了进一步例证,该图显示具有相似FLOPs的网络具有不同的速度。因此,将FLOPs作为计算复杂度的唯一指标是不够的,可能导致次优设计。
间接指标(FLOPs)和直接指标(速度)之间的差异可以归因于两个主要原因。首先,FLOPs没有考虑一些对速度有很大影响的重要因素。其中一个因素是内存访问成本(MAC)。这种成本在某些操作(如组卷积)的运行时中占很大比例。它可能是在具有强大计算能力的设备(例如GPU)上的瓶颈。在网络架构设计期间不应简单忽略此成本。另一个是并行度。在相同FLOPs下,并行度高的模型可能比并行度低的模型快得多。
其次,具有相同FLOPs的操作在不同平台上的运行时间可能不同。例如,张量分解在早期工作 [20,21,22] 中被广泛用于加速矩阵乘法。然而,最近的工作 [19] 发现,尽管[22]中的分解减少了75%的FLOPs,但在GPU上却更慢。我们调查了这个问题,发现这是因为最新的CUDNN [23]库特别优化了 3 × 3 3 \times 3 3×3卷积。我们不能当然地认为 3 × 3 3 \times 3 3×3卷积比 1 × 1 1 \times 1 1×1卷积慢9倍。
基于这些观察,我们提出在有效的网络架构设计中应考虑两个原则。首先,应使用直接指标(例如速度)而不是间接指标(例如FLOPs)。其次,应在目标平台上评估此类指标。
在这项工作中,我们遵循这两个原则,并提出了一种更有效的网络架构。在第2节中,我们首先分析了两种具有代表性的最先进的网络[15,14]的运行时性能。然后,我们得出了四条高效网络设计的指导原则,这些原则不仅仅是考虑浮点运算数(FLOPs)。虽然这些指导原则是平台无关的,但我们在两个不同的平台(GPU和ARM)上进行了一系列受控实验,并进行了专用代码优化,以确保我们的结论是最先进的。
在第3节中,我们根据这些指导原则设计了一种新的网络结构。由于它受到ShuffleNet[15]的启发,因此被称为ShuffleNet V2。通过第4节的综合验证实验,证明它在两个平台上都比以前的网络更快、更准确。图1(a)(b)给出了比较概览。例如,在给定40M FLOPs的计算复杂度预算下,ShuffleNet v2分别比ShuffleNet v1和MobileNet v2准确率高出 3.5 % 3.5 \% 3.5%和 3.7 % 3.7 \% 3.7%。
2. 高效网络设计的实用指导原则
我们的研究是在两个广泛采用的、具有行业级卷积神经网络(CNN)库优化的硬件上进行的。我们注意到,我们的CNN库比大多数开源库更高效。因此,我们确保我们的观察和结论对于工业实践是坚实且有意义的。
- GPU。使用的是NVIDIA GeForce GTX 1080Ti单卡。卷积库是CUDNN 7.0[23]。我们还激活了CUDNN的基准测试功能,以分别选择不同卷积的最快算法。
- ARM。使用的是高通骁龙810。我们使用了高度优化的基于Neon的实现。评估时使用单线程。
其他设置包括:启用了所有优化选项(例如,张量融合,用于减少小操作的开销)。输入图像大小为 224 × 224 224 \times 224 224×224。每个网络都随机初始化并评估100次。使用平均运行时间。
为了开展本研究,我们分析了两种最先进的网络ShuffleNet v1[15]和MobileNet v2[14]的运行时性能。它们在ImageNet分类任务上都非常高效且准确。它们都被广泛用于手机等低端设备。虽然我们只分析了这两个网络,但我们注意到它们代表了当前的趋势。其核心是组卷积和深度卷积,这也是其他最先进的网络(如ResNeXt[7]、Xception[12]、MobileNet[13]和CondenseNet[16])的关键组件。
总运行时被分解为不同的操作,如图2所示。我们注意到,FLOPs指标仅考虑了卷积部分。虽然这部分消耗了大部分时间,但其他操作(包括数据输入/输出、数据重排和逐元素操作(AddTensor、ReLU等))也占用了相当多的时间。因此,FLOPs并不是实际运行时间的足够准确的估计。
基于这一观察,我们从几个不同的方面对运行时(或速度)进行了详细分析,并得出了几条高效网络架构设计的实用指导原则。
G1) 等通道宽度可最小化内存访问成本(MAC)。现代网络通常采用深度可分离卷积[12,13,15,14],其中逐点卷积(即 1 × 1 1 \times 1 1×1卷积)占据了大部分复杂度[15]。我们研究了 1 × 1 1 \times 1 1×1卷积的核形状。该形状由两个参数指定:输入通道数 c 1 c_{1} c1和输出通道数 c 2 c_{2} c2。设特征图的空间大小为 h h h和 w w w,则 1 × 1 1 \times 1 1×1卷积的FLOPs为 B = h w c 1 c 2 B=h w c_{1} c_{2} B=hwc1c2。
为简化起见,我们假设计算设备的缓存足够大,可以存储整个特征图和参数。因此,内存访问成本(MAC)或内存访问操作的数量为MAC = h w ( c 1 + c 2 ) + c 1 c 2 =h w\left(c_{1}+c_{2}\right)+c_{1} c_{2} =hw(c1+c2)+c1c2。注意,这两项分别对应于输入/输出特征图和核权重的内存访问。
根据均值不等式,我们有
MAC ≥ 2 h w B + B h w \text{MAC} \geq 2\sqrt{hwB} + \frac{B}{hw} MAC≥2hwB+hwB
因此,MAC有一个由浮点运算数(FLOPs)给出的下界。当输入和输出通道的数量相等时,它达到这个下界。
这个结论是理论上的。在实践中,许多设备的缓存并不足够大。此外,现代计算库通常采用复杂的分块策略来充分利用缓存机制[24]。因此,实际的MAC可能会偏离理论值。为了验证上述结论,进行了如下实验。通过重复堆叠10个构建块来构建一个基准网络。每个构建块包含两个卷积层。第一个卷积层包含 c 1 c_{1} c1个输入通道和 c 2 c_{2} c2个输出通道,第二个则相反。
表1报告了在固定总FLOPs的情况下,通过改变 c 1 : c 2 c_{1}:c_{2} c1:c2的比例来测试的运行速度。很明显,当 c 1 : c 2 c_{1}:c_{2} c1:c2接近 1 : 1 1:1 1:1时,MAC变小,网络评估速度更快。
G2) 过度使用组卷积会增加MAC。组卷积是现代网络架构的核心[7,15,25,26,27,28]。它通过将所有通道之间的密集卷积变为稀疏(仅在通道组内)来降低计算复杂度(FLOPs)。一方面,在给定固定FLOPs的情况下,它允许使用更多的通道,并增加网络容量(从而提高准确性)。另一方面,通道数量的增加会导致MAC增加。
正式地,遵循G1和等式1中的符号, 1 × 1 1 \times 1 1×1组卷积的MAC和FLOPs之间的关系为
MAC = h w ( c 1 + c 2 ) + c 1 c 2 g = h w c 1 + B g c 1 + B h w \begin{aligned} \text{MAC} &= hw(c_{1} + c_{2}) + \frac{c_{1}c_{2}}{g} \\ &=hwc_{1} + \frac{Bg}{c_{1}} + \frac{B}{hw} \end{aligned} MAC=hw(c1+c2)+gc1c2=hwc1+c1Bg+hwB
其中 g g g是组数, B = h w c 1 c 2 / g B =hwc_{1}c_{2}/g B=hwc1c2/g是FLOPs。很容易看出,在给定固定输入形状 c 1 × h × w c_{1} \times h \times w c1×h×w和计算成本 B B B的情况下,MAC随着 g g g的增长而增加。
为了研究实践中的影响,通过堆叠10个点组卷积层来构建一个基准网络。表2报告了在固定总FLOPs的情况下,使用不同组数的运行速度。很明显,使用大量的组会显著降低运行速度。例如,在GPU上使用8组比使用1组(标准密集卷积)慢两倍以上,在ARM上则慢30%。这主要是由于MAC的增加。我们注意到,我们的实现已经经过特殊优化,并且比逐组计算卷积要快得多。
因此,我们建议根据目标平台和任务仔细选择组数。仅仅因为使用更多的通道可能会增加准确性而简单地使用大量的组是不明智的,因为准确性增加的好处很容易被迅速增加的计算成本所抵消。
G3) 网络碎片化降低了并行度。在GoogLeNet系列[29,30,3,31]和自动生成的架构[9,11,10]中,每个网络构建块都广泛采用“多路径”结构。使用大量的小运算符(这里称为“碎片化运算符”)代替少数几个大的运算符。例如,在NASNET-A[9]中,碎片化运算符的数量(即一个构建块中单个卷积或池化运算的数量)为13。相比之下,在像ResNet[4]这样的常规结构中,这个数量是2或3。
尽管这种碎片化的结构已被证明对准确性有益,但它可能会降低效率,因为它对具有强大并行计算能力的设备(如GPU)不友好。它还引入了额外的开销,如内核启动和同步。
为了量化网络碎片化如何影响效率,我们评估了一系列具有不同程度碎片化的网络构建块。具体来说,每个构建块由1到4个 1 × 1 1 \times 1 1×1卷积组成,这些卷积按顺序或并行排列。构建块的结构在附录中进行了说明。每个构建块都重复堆叠了10次。表3中的结果显示,碎片化在GPU上显著降低了速度,例如,4个碎片的结构比1个碎片的结构慢了3倍。在ARM上,速度降低相对较小。
G4) 元素级操作不可忽视。如图2所示,在轻量级模型(如[15,14])中,元素级操作占用了大量时间,尤其是在GPU上。在这里,元素级运算符包括ReLU、AddTensor、AddBias等。它们的浮点运算数(FLOPs)较小,但MAC(内存访问成本)相对较高。特别地,我们还将深度卷积[12,13,14,15]视为元素级运算符,因为它也具有高MAC/FLOPs比。
为了验证这一点,我们在ResNet[4]中的“瓶颈”单元(由 1 × 1 1 \times 1 1×1卷积、 3 × 3 3 \times 3 3×3卷积和 1 × 1 1 \times 1 1×1卷积依次组成,带有ReLU和快捷连接)上进行了实验。我们分别移除了ReLU和快捷操作。表4报告了不同变体的运行时间。我们观察到,在移除ReLU和快捷操作后,GPU和ARM上的速度都提高了约20%。
结论与讨论基于上述指南和实证研究,我们得出结论:高效的网络架构应该1)使用“平衡”的卷积(通道宽度相等);2)意识到使用组卷积的成本;3)降低碎片化程度;4)减少元素级操作。这些期望的特性取决于平台特性(如内存操作和代码优化),这些特性超出了理论FLOPs的范围。在实际网络设计中应考虑这些因素。
最近轻量级神经网络架构的进展[15,13,14,9,11,10,12]大多基于FLOPs的指标,并未考虑上述特性。例如,ShuffleNet v1[15]大量使用组卷积(违反G2),并采用类似瓶颈的构建块(违反G1)。MobileNet v2[14]使用了一种违反G1的倒置瓶颈结构,它在“厚”特征图上使用深度卷积和ReLU。这违反了G4。自动生成的结构[9,11,10]高度碎片化,违反了G3。
3 ShuffleNet V2:一种高效架构
回顾ShuffleNet v1 [15]。ShuffleNet是一种最先进的网络架构,广泛应用于手机等低端设备中。它激发了我们的工作灵感,因此,我们首先对其进行回顾和分析。
根据[15],轻量级网络面临的主要挑战是在给定的计算预算(FLOPs)下,只能承受有限数量的特征通道。为了在不显著增加FLOPs的情况下增加通道数量,[15]中采用了两种技术:逐点组卷积和类似瓶颈的结构。然后引入了一个“通道混洗”操作,以实现不同通道组之间的信息通信并提高准确性。构建块如图3(a)(b)所示。
如第2节所述,逐点组卷积和瓶颈结构都会增加MAC(G1和G2)。这一成本不可忽视,尤其是对于轻量级模型。此外,使用过多的组会违反G3。快捷连接中的元素级“Add”操作也是不可取的(G4)。因此,为了实现高模型容量和效率,关键问题是如何在不使用密集卷积和过多组的情况下,保持大量且等宽的通道。
为了实现上述目标,我们引入了一个简单的操作符,称为通道拆分。它如图3©所示。在每个单元的开始,将 c c c个特征通道的输入拆分为两个分支,分别有 c − c ′ c-c^{\prime} c−c′和 c ′ c^{\prime} c′个通道。遵循G3,一个分支保持不变。另一个分支由三个具有相同输入和输出通道的卷积组成,以满足G1。与[15]不同,这两个 1 × 1 1 \times 1 1×1卷积不再是组卷积。这部分是为了遵循G2,部分是因为拆分操作已经产生了两个组。
卷积后,两个分支被拼接在一起。因此,通道数量保持不变(G1)。然后,使用与[15]中相同的“通道混洗”操作来实现两个分支之间的信息通信。
混洗后,下一个单元开始。注意,ShuffleNet v1 [15]中的“Add”操作不再存在。ReLU和深度卷积等元素级操作仅存在于一个分支中。此外,三个连续的元素级操作,“拼接”、“通道混洗”和“通道拆分”,被合并为一个单一的元素级操作。根据G4,这些更改是有益的。
对于空间下采样,单元进行了轻微修改,如图3(d)所示。移除了通道拆分操作符。因此,输出通道数量加倍。
提出的构建块©(d)以及由此产生的网络被称为ShuffleNet V2。基于上述分析,我们得出结论,该架构设计非常高效,因为它遵循了所有指导原则。
构建块被重复堆叠以构建整个网络。为了简化,我们设置 c ′ = c / 2 c^{\prime}=c / 2 c′=c/2。整体网络结构与ShuffleNet v1 [15]相似,并在表5中进行了总结。只有一个区别:在全局平均池化之前添加了一个额外的 1 × 1 1 \times 1 1×1卷积层来混合特征,这在ShuffleNet v1中是不存在的。与[15]类似,通过缩放每个块中的通道数量来生成不同复杂度的网络,标记为 0.5 × 0.5 \times 0.5×、 1 × 1 \times 1×等。
网络准确性分析 ShuffleNet v2不仅高效,而且准确。这主要有两个原因。首先,每个构建块的高效率使得能够使用更多的特征通道和更大的网络容量。
其次,在每个块中,当 c ′ = c / 2 c^{\prime}=c / 2 c′=c/2时,一半的特征通道直接通过该块并加入下一个块。这可以视为一种特征重用,与DenseNet [6]和CondenseNet [16]中的精神相似。
在DenseNet[6]中,为了分析特征重用模式,绘制了层间权重的 l 1 l_1 l1范数,如图4(a)所示。显然,相邻层之间的连接比其他层之间的连接更强。这表明所有层之间的密集连接可能会引入冗余。最近的CondenseNet[16]也支持这一观点。
在ShuffleNet V2中,很容易证明第 i i i个和第 ( i + j ) (i+j) (i+j)个构建块之间“直接连接”的通道数为 r j c r^{j}c rjc,其中 r = ( 1 − c ′ ) / c r=\left(1-c^{\prime}\right) / c r=(1−c′)/c。换句话说,特征重用的数量随着两个块之间距离的增大而指数衰减。在距离较远的块之间,特征重用变得非常弱。图4(b)绘制了 r = 0.5 r=0.5 r=0.5时与(a)类似的可视化图。注意,(b)中的模式与(a)相似。
因此,ShuffleNet V2的结构通过设计实现了这种类型的特征重用模式。它具有与DenseNet[6]中用于高精度的特征重用类似的优点,但如前所述,它更加高效。这在实验中得到验证,如表8所示。
4 实验
我们的消融实验在ImageNet 2012分类数据集[32,33]上进行。按照常见做法[15,13,14],所有比较的网络都有四个计算复杂度级别,即大约40、140、300和500+ MFLOPs(百万次浮点运算)。这种复杂度对于移动场景来说是典型的。其他超参数和协议与ShuffleNet v1[15]完全相同。
我们与以下网络架构[12,14,6,15]进行了比较:
- ShuffleNet v1[15]。在[15]中,比较了一系列组数 g g g。结果表明, g = 3 g=3 g=3在精度和速度之间取得了更好的权衡。这也与我们的观察结果一致。在这项工作中,我们主要使用 g = 3 g=3 g=3。
- MobileNet v2[14]。它比MobileNet v1[13]更好。为了进行全面比较,我们报告了原始论文[14]和我们重新实现中的准确性,因为[14]中的一些结果不可用。
- Xception[12]。原始的Xception模型[12]非常大(FLOPs >2G),超出了我们的比较范围。最近的工作[34]提出了一种改进的轻量级Xception结构,它在精度和效率之间表现出更好的权衡。因此,我们与该变体进行了比较。
- DenseNet[6]。原始工作[6]只报告了大型模型的结果(FLOPs >2G)。为了进行直接比较,我们根据表5中的架构设置对其进行了重新实现,其中第2-4阶段的构建块由DenseNet块组成。我们调整了通道数以满足不同的目标复杂度。
表8总结了所有结果。我们从不同方面分析了这些结果。
精度与FLOPs。显然,所提出的ShuffleNet v2模型在精度上大幅优于其他所有网络 2 { }^{2} 2,尤其是在较小的计算预算下。此外,我们注意到MobileNet v2在40 MFLOPs级别和 224 × 224 224 \times 224 224×224图像尺寸下表现不佳。这可能是因为通道太少。相比之下,我们的模型不会受到这一缺点的影响,因为我们高效的设计允许使用更多通道。此外,尽管我们的模型和DenseNet[6]都重用特征,但我们的模型更加高效,如第3节所述。
表8还将我们的模型与其他最先进的网络进行了比较,包括CondenseNet[16]、IGCV2[27]和IGCV3[28](在适当的情况下)。我们的模型在不同复杂度级别上始终表现出更好的性能。
推理速度与FLOPs/精度。对于四个精度较高的架构(ShuffleNet v2、MobileNet v2、ShuffleNet v1和Xception),我们比较了它们的实际速度与FLOPs,如图1©(d)所示。附录表1提供了不同分辨率下的更多结果。
ShuffleNet v2明显比其他三个网络更快,尤其是在GPU上。例如,在500 MFLOPs下,ShuffleNet v2比MobileNet v2快 58 % 58\% 58%,比ShuffleNet v1快 63 % 63\% 63%,比Xception快 25 % 25\% 25%。在ARM上,ShuffleNet v1、Xception和ShuffleNet v2的速度相当;然而,MobileNet v2要慢得多,尤其是在FLOPs较小的情况下。我们认为这是因为MobileNet v2具有更高的MAC(见第2节中的G1和G4),这在移动设备上很重要。
与MobileNet v1 [13]、IGCV2 [27]和IGCV3 [28]相比,我们有两个观察结果。首先,虽然MobileNet v1的准确度不如其他模型,但其在GPU上的速度比包括ShuffleNet v2在内的所有同类模型都快。我们认为,这是因为其结构满足了我们提出的大部分指导原则(例如,对于G3,MobileNet v1的碎片甚至比ShuffleNet v2还少)。其次,IGCV2和IGCV3的速度较慢,这是因为它们使用了太多的卷积组(在[27,28]中分别为4个或8个)。这两个观察结果都与我们提出的指导原则一致。
最近,自动模型搜索[9,10,11,35,36,37]已成为卷积神经网络(CNN)架构设计的一个有前途的趋势。表8的下半部分评估了一些自动生成的模型。我们发现,它们的速度相对较慢。我们认为,这主要是因为使用了太多的碎片(见G3)。然而,这个研究方向仍然很有前途。如果可以将模型搜索算法与我们提出的指导原则相结合,并在目标平台上评估直接指标(速度),那么可能会获得更好的模型。
最后,图1(a)(b)总结了准确度与速度(直接指标)的结果。我们得出结论:ShuffleNet v2在GPU和ARM上的表现都是最好的。
与其他方法的兼容性。ShuffleNet v2可以与其他技术相结合,以进一步提高性能。当配备了压缩和激励(SE)模块[8]后,ShuffleNet v2的分类准确度提高了0.5%,但速度略有下降。块结构如图2(b)(附录中)所示。结果如表8(下半部分)所示。
推广到大模型。虽然我们的主要消融实验是针对轻量级场景的,但ShuffleNet v2也可以用于大模型(例如,浮点运算数(FLOPs) ≥ 2 G \geq 2 \mathrm{G} ≥2G)。表6比较了一个50层的ShuffleNet v2(详细信息见附录)与ShuffleNet v1 [15]和ResNet-50 [4]的同类模型。ShuffleNet v2在2.3GFLOPs时仍然优于ShuffleNet v1,并且在FLOPs少40%的情况下超过了ResNet-50。
对于非常深的ShuffleNet v2(例如,超过100层),为了使训练更快收敛,我们对基本的ShuffleNet v2单元进行了轻微修改,增加了一条残差路径(详细信息见附录)。表6展示了一个配备了SE [8]组件(详细信息见附录)的164层的ShuffleNet v2模型。它在比先前最先进的模型[8]少得多的FLOPs下获得了更高的准确度。
目标检测。为了评估泛化能力,我们还测试了COCO目标检测[38]任务。我们使用最先进的轻量级检测器——轻量级头部区域卷积神经网络(Light-Head RCNN)[34]作为我们的框架,并遵循相同的训练和测试协议。我们只替换了主干网络。模型首先在ImageNet上进行预训练,然后在检测任务上进行微调。训练时,我们使用COCO的训练+验证集(除了来自minival集的5000张图像),并使用minival集进行测试。准确度指标是COCO标准的平均精度均值(mAP),即在框的交并比(IoU)阈值从0.5到0.95下的平均mAP。
ShuffleNet v2与其他三个轻量级模型(Xception [12,34]、ShuffleNet v1 [15]和MobileNet v2 [14])在四个复杂度级别上进行了比较。表7中的结果表明,ShuffleNet v2的表现最好。
将检测结果(表7)与分类结果(表8)进行比较,有趣的是,在分类上,准确度排名为ShuffleNet v2 ≥ \geq ≥ MobileNet v2 > ShuffleNet v1 > Xception,而在检测上,排名变为ShuffleNet v2 > Xception ≥ \geq ≥ ShuffleNet v1 ≥ \geq ≥ MobileNet v2。这表明Xception在检测任务上表现良好。这可能是因为Xception构建块的感受野比其他同类模型更大(7 vs. 3)。受此启发,我们也通过在每个构建块中的第一个逐点卷积之前引入一个额外的 3 × 3 3 \times 3 3×3深度卷积来增大ShuffleNet v2的感受野。这个变体表示为ShuffleNet v2*。它仅增加了少量的FLOPs,就进一步提高了准确度。
我们还测试了GPU上的运行时间。为了公平比较,我们将批量大小设置为4,以确保GPU满载。由于数据复制(分辨率为 800 × 1200 800 \times 1200 800×1200)和其他特定于检测的操作(如位置敏感区域兴趣池化(PSRoI Pooling)[34])的开销,不同模型之间的速度差距比分类任务小。尽管如此,ShuffleNet v2的表现仍然优于其他模型,例如,它比ShuffleNet v1快约40%,比MobileNet v2快约16%。
此外,变体ShuffleNet v2*具有最高的准确度,并且仍然比其他方法更快。这引发了一个实际问题:如何增大感受野?这对于高分辨率图像中的目标检测[39]至关重要。我们将在未来研究这个话题。
5 结论
我们提出,网络架构设计应考虑速度等直接指标,而不是浮点运算数(FLOPs)等间接指标。我们提出了实用的指导原则和一个新颖的架构ShuffleNet v2。全面的实验验证了我们新模型的有效性。我们希望这项工作能够激发未来对平台感知和更实用的网络架构设计的研究。
致谢。感谢魏一尘在论文写作方面的帮助。本研究得到了国家自然科学基金(项目号:61773229)的部分资助。
附录
相关文章:
ShuffleNet V2:高效卷积神经网络架构设计的实用指南
摘要 https://arxiv.org/pdf/1807.11164 当前,神经网络架构设计大多以计算复杂度的间接指标,即浮点运算数(FLOPs)为指导。然而,直接指标(例如速度)还取决于其他因素,如内存访问成本…...
1123--collection接口,list接口,set接口
目录 一 java 1. 集合 2. 集合框架图--remember 3. collection接口 3.1 collection接口的常用方法 3.1.1 add() 3.1.2 remove()-返回删除后的对象 3.1.3 contains()--返回布尔值 3.1.4 size&…...
基于BindingList的WinForm数据绑定机制与DataGridView动态刷新技术
前言: 本文以连接SQLite为例进行代码演示 一、首先建立里一个模型类 public class MyData{public int id { get; set; }public string name { get; set; }public int age { get; set; }public string sex { get; set; }public string address { get; set; }} 二、…...
大数据新视界 -- Hive 数据分区:精细化管理的艺术与实践(上)(7/ 30)
💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...
对于相对速度的重新理解 - 插一句
因为发了太多的公式,系统提示插入图片太频繁,下一个部分稍后再写。 这里要强调一下: 狭义相对论的平方和形式,其实就是因为分不清虚数单位的大小才写成这个样子。或者用物理语言来说,就是认为所有惯性系的“光速”都…...
css基础(27)_行内、行内块元素之间的空白问题
行内、行内块元素之间的空白问题 产生的原因:行内元素、行内块元素,彼此之间的换行会被浏览器解析为一个空白字符。 案例一: <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8">&…...
如果接口返回值图片有很长一串码,需要添加前缀
需要在前面添加前缀:data:image/jpeg;base64,然后将值赋值给<img :src"originalImage" /> this.tableLists.map((item)>{item.originalImage "data:image/jpeg;base64,"item.originalImage})以上方法会导致出现一个小bug,…...
《AI大模型开发笔记》——ollama应用全面解析
入门篇 1 ollama是什么? Ollama 是一个支持在本地运行大语言模型的工具,兼容 Windows、Linux 和 MacOS 操作系统。使用 Ollama,您仅需一行命令即可启动模型。 2 如何安装? Windows和MacOS用户,从下面链接下载安装即可: 下载地址:https://ollama.com/download Linux系…...
Paddle Inference部署推理(三)
三:Paddle Inference推理 导出模型 Paddle Inference支持使用飞桨静态图模型进行推理,您可以通过以下两种方式获取静态图模型: (1)飞桨框架导出推理模型 飞桨框架在训练模型过程中,会在本地存储最终训练…...
CSP/信奥赛C++语法基础刷题训练(23):洛谷P1217:[USACO1.5] 回文质数 Prime Palindromes
CSP/信奥赛C语法基础刷题训练(23):洛谷P1217:[USACO1.5] 回文质数 Prime Palindromes 题目描述 因为 151 151 151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 151 …...
《跨越语言壁垒:Python 人工智能原型到 C++可执行程序的转型之路》
在人工智能的广阔天地里,Python 以其简洁易用和丰富的库资源成为众多开发者快速搭建人工智能原型的首选语言。然而,在一些对性能和资源控制要求极高的场景下,C则展现出无可比拟的优势。那么,如何将 Python 中开发的人工智能原型代…...
flowable流程图详细绘制教程
文章目录 前言一、flowable是什么?回答下之前的问题 二、flowable-modeler使用1. 使用步骤2.开始绘制弄一个请假的流程 三 加载该流程总结 前言 flowable有些晦涩难懂的东西: 我最开始接触的时候,还是用的activity,当时觉得好复杂,那么这次经过我自己在…...
Figma入门-基本操作制作登录页
Figma入门-基本操作制作登录页 前言 在之前的工作中,大家的原型图都是使用 Axure 制作的,印象中 Figma 一直是个专业设计软件。 最近,很多产品朋友告诉我,很多原型图都开始用Figma制作了,并且很多组件都是内置的&am…...
在windows操作系统上,用git与github账户连接
一、环境准备 1.1 git软件 1.2 github账号 1.3 创建一个项目目录,比如 D:\project\gitproject 二、开始操作 1. 进入项目目录下,右键,如图,打开git bash命令行 2. 在命令行输入以下三个命令 $ git config --global user.name &quo…...
springboot系列--拦截器执行原理
一、拦截器核心概念 一、定义 拦截器(Interceptor)是框架级别的组件,用于在请求的不同阶段(如到达控制器之前(也就是接口)、处理完成之后)动态地拦截和处理 HTTP 请求。 二、使用场景 一、用户…...
数据可视化复习2-绘制折线图+条形图(叠加条形图,并列条形图,水平条形图)+ 饼状图 + 直方图
目录 目录 一、绘制折线图 1.使用pyplot 2.使用numpy 编辑 3.使用DataFrame 编辑 二、绘制条形图(柱状图) 1.简单条形图 2.绘制叠加条形图 3.绘制并列条形图 4.水平条形图 编辑 三、绘制饼状图 四、绘制散点图和直方图 1.散点图 2…...
STM32F10x 定时器
使用定时器实现:B5 E5的开关 添加相关的.h路径文件 添加相关的.c配置文件 led.h文件 用于声明LED函数 #ifndef __LED_H //没有定义__LED_H #define __LED_H //就定义__LED_H #define LED1_ON GPIO_ResetBits(GPIOB,GPIO_Pin_5) #defi…...
VBA技术资料MF230:展开所有折叠视图并恢复
我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套,分为初级、中级、高级三大部分,教程是对VBA的系统讲解&#…...
【数据结构OJ】【图论】图综合练习--拓扑排序
题目描述 已知有向图,顶点从0开始编号,求它的求拓扑有序序列。 拓扑排序算法:给出有向图邻接矩阵 1.逐列扫描矩阵,找出入度为0且编号最小的顶点v 2.输出v,并标识v已访问 3.把矩阵第v行全清0 重复上述步骤࿰…...
网络安全防范
网络安全防范技术 所属课程网络攻防实践作业要求第六次作业 实践内容 学习总结 PDR,$$P^2$$DR安全模型。 防火墙(Firewall): 网络访问控制机制,布置在网际间通信的唯一通道上。 不足:无法防护内部威胁&…...
Linux nc 命令详解
简介 nc 全称 netcat,是一个在 Linux 中多功能的网络工具,通常用于通过 TCP 或 UDP 读取和写入网络连接,也能作为客户端或服务端用来 debug,测试,网络问题分析。 常用示例 检查端口是否是打开的 nc -zv <hostna…...
解决 Gradle 报错:`Plugin with id ‘maven‘ not found` 在 SDK 开发中的问题
在 SDK 开发过程中,使用 Gradle 构建和发布 SDK 是常见的任务。在将 SDK 发布为 AAR 或 JAR 包时,你可能会使用 apply plugin: maven 来发布到本地或远程的 Maven 仓库。但是,随着 Gradle 版本的更新,特别是从 Gradle 7 版本开始&…...
stm32cubemx+VSCODE+GCC+makefile 开发环境搭建
title: stm32cubemxVSCODEGCCmakefile 开发环境搭建 tags: FreertosHalstm32cubeMx 文章目录 内容往期内容导航第一步准备环境vscode 插件插件配置点灯 内容 往期内容导航 第一步准备环境 STM32CubeMXVSCODEMinGWOpenOcdarm-none-eabi-gcc 然后把上面下载的软件 3 4 5 bin 文…...
postgresql|数据库开发|python的psycopg2库按指定顺序批量执行SQL文件(可离线化部署)
一、 psycopg2简介 psycopg2库是python的一个可直接操作postgresql数据库的类库,是一个用于Python编程语言的PostgreSQL数据库适配器。它允许开发人员使用Python语言与PostgreSQL数据库进行交互和操作,不同于java,需要专用的一个驱动&#…...
学习ASP.NET Core的身份认证(基于Cookie的身份认证3)
用户通过验证后调用HttpContext.SignInAsync函数将用户的身份信息保存在认证Cookie中,以便后续的请求可以验证用户的身份,该函数原型如下所示,其中properties参数的主要属性已在前篇文章中学习,本文学习scheme和principal的意义及用法。 public static …...
Java 中的 HashMap 原理详解:底层结构与实现机制
HashMap 是 Java 中最常用的数据结构之一,它以其高效的存取速度在众多应用场景中被广泛使用。理解 HashMap 的底层实现原理,对提升开发效率、优化性能以及编写高效的代码都至关重要。本文将深入探讨 HashMap 的数据结构、存储机制、解决冲突的策略、扩容…...
数据库MYSQL——表的设计
文章目录 前言三大范式:几种实体间的关系:一对一关系:一对多关系:多对多关系: 前言 之前的博客中我们讲解的是关于数据库的增删改查与约束的基本操作, 是在已经创建数据库,表之上的操作。 在实…...
CUDA补充笔记
文章目录 一、不同核函数前缀二、指定kernel要执行的线程数量三、线程需要两个内置坐标变量来唯一标识线程四、不是blocksize越大越好,上限一般是1024个blocksize 一、不同核函数前缀 二、指定kernel要执行的线程数量 总共需要线程数是: 1 * N N个线程…...
OSI七层模型和TCP/IP五层模型详细介绍
这里写目录标题 一.OSI含义二.OSI七层模型1.应用层2.表示层3.会话层4.传输层5.网络层6.数据链路层7.物理层 TCP/IP五层协议1.应用层2.运输层运行在TCP上的协议运行在UDP上的协议 3.网络层IP协议配套使用的协议 4.数据链路层 四.网络协议分层的好处 一.OSI含义 OSI即是开放式通…...
mac安装Pytest、Allure、brew
安装环境 安装pytest 命令 pip3 install pytest 安装allure 命令:brew install allure 好吧 那我们在安装allure之前 我们先安装brew 安装brew 去了官网复制了命令 还是无法下载 如果你们也和我一样可以用这个方法哦 使用国内的代码仓库来执行brew的安装脚本…...
Linux/Windows/OSX 上面应用程序重新启动运行。
1、Linux/OSX 上面重新运行程序,直接使用 execvp 函数就可以了,把main 函数传递来的 argv 二维数组(命令行参数)传进去就可以,注意不要在 fork 出来的子进程搞。 2、Windows 平台可以通过 CreateProcess 函数来创建新的…...
自定义 Kafka 脚本 kf-use.sh 的解析与功能与应用示例
Kafka:分布式消息系统的核心原理与安装部署-CSDN博客 自定义 Kafka 脚本 kf-use.sh 的解析与功能与应用示例-CSDN博客 Kafka 生产者全面解析:从基础原理到高级实践-CSDN博客 Kafka 生产者优化与数据处理经验-CSDN博客 Kafka 工作流程解析:…...
Odoo :免费且开源的农牧行业ERP管理系统
文 / 开源智造Odoo亚太金牌服务 引言 提供农牧企业数字化、智能化、无人化产品服务及全产业链高度协同的一体化解决方案,提升企业智慧种养、成本领先、产业互联的核心竞争力。 行业典型痛点 一、成本管理粗放,效率低、管控弱 产品研发过程缺少体系化…...
AI的自我陷阱:大型神经网络训练中的模型崩溃现象
10月7日,发布在arxiv上的一篇名为Strong Model Collapse的论文,由Meta 、纽约大学和加州大学洛杉矶分校的研究人员共同发表的研究表明在训练大型神经网络(如 ChatGPT 和 Llama)时,由于训练语料库中包含合成数据而导致的…...
Python(下载安装)
简介 开发工具:pycharm, VS Code 1. 下载(解释器程序) Download Python | Python.org 2. 安装(解释器程序) 双击下载后的exe文件 查看版本:python(并可以执行python代码) 3. 下载…...
记录一种在内核空间向用户空间通知中断的方法
记录一种在内核空间向用户空间通知中断的方法 0.前言1.代码实现1)内核设备驱动实现2)消息通知实现3)测试程序 2.解析 参考文章:Linux驱动实践:中断处理函数如何【发送信号】给应用层? 0.前言 最近在项目中遇到一个需求,需要将一个…...
Apache Maven 标准文件目录布局
Apache Maven 采用了一套标准的目录布局来组织项目文件。这种布局提供了一种结构化和一致的方式来管理项目资源,使得开发者更容易导航和维护项目。理解和使用标准目录布局对于有效的Maven项目管理至关重要。本文将探讨Maven标准目录布局的关键组成部分,并…...
【vim】使用 gn 组合命令实现搜索选中功能
gn是Vim 7.4新增的一个操作(motion),作用是跳到并选中下一个搜索匹配项。 具体说,Vim里执行搜索后,执行n操作只会跳转到下一个匹配项,而不选中它。但是我们往往需要对匹配项执行一些修改操作,例…...
解决登录Google账号遇到手机上Google账号无法验证的问题
文章目录 场景小插曲解决方案总结 场景 Google账号在新的设备上登录的时候,会要求在手机的Google上进行确认验证,而如果没有安装Google play就可能出现像我一样没有任何弹框,无法实现验证 小插曲 去年,我在笔记本上登录了Googl…...
基于YOLOv10深度学习的公共安全持刀行为检测系统研究与实现(PyQt5界面+数据集+训练代码)
随着社会的不断进步和城市化进程的加快,人口密度的增加和社会结构的复杂化使得公共安全问题日益凸显。近年来,各类公共安全事件频发,其中持刀行为作为一种典型的暴力行为,已成为威胁公共安全的严重因素之一。这种行为在公共场所发…...
HP6心率血压传感器
目录 一、介绍 1、工作原理概述 2、具体实现步骤 二、HP6的通信及配置 1、通信接口 2、器件地址/命令 3、校验 三、程序设计 ①IIC通信相关基础函数 ②HP6相关基础函数 一、介绍 HP6心率血压传感器的原理主要基于光电容积脉搏波描记法(PPG)&…...
深入理解 JVM 中的 G1 垃圾收集器原理、算法、过程和参数配置
引言 Java 虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称 GC)是自动内存管理的核心部分。G1(Garbage-First)垃圾收集器是 Oracle 在 JDK 7u4 版本中引入的一种新型垃圾收集器,…...
细说敏捷:敏捷四会之standup meeting
上一篇文章中,我们讨论了 敏捷四会 中 冲刺计划会 的实施要点,本篇我们继续分享敏捷四会中实施最频繁,团队最容易实施但往往也最容易走形的第二个会议:每日站会 关于每日站会的误区 站会是一个比较有标志性的仪式活动࿰…...
MySQL系列之身份鉴别(安全)
导览 前言Q:如何保障MySQL数据库身份鉴别的有效性一、有效性检查1. 用户唯一2. 启用密码验证3. 是否存在空口令用户4. 是否启用口令复杂度校验5. 是否设置口令的有效期6. 是否限制登录失败尝试次数7. 是否设置(超过尝试次数)锁定的最小时长8.…...
vue3封装Element Plus table表格组件
支持绝大部分Element Plus原有设置属性,支持分页,支持动态适配高度 效果展示 组件代码: <template><div class"table-wrap" ref"tableWrap"><el-tableclass"w100 h100":data"tableInfo.…...
SFP+光模块介绍
SFP光模块介绍 1 SFP光模块简介(Small Form -Factor Pluggable)2 光模块管脚定义 1 SFP光模块简介(Small Form -Factor Pluggable) 光模块(Optical Module)由光电子器件、功能电路和光接口等组成,光电子器件包括激光发射器(Laser Transmitte…...
神经网络的初始化
目录 为什么需要初始化? 初始化的常用方法: 是否必须初始化? 初始化神经网络中的权重和偏置是深度学习模型训练中非常重要的一步,虽然在某些情况下不进行初始化也能训练出模型,但正确的初始化方法能够显著提高训练效…...
数据集搜集器0.01
我们使用Python的Tkinter库来创建GUI界面,并使用requests库来从360百科获取数据。下面是一个完整的示例代码,它包括了一个简单的GUI界面,用户可以输入问题,点击按钮后会从360百科获取相关信息,并显示在同一个Text组件中…...
【Lucene】搜索引擎和文档相关性评分 BM25 算法的工作原理
BM25 算法的工作原理: 什么是 BM25 算法? BM25 是一种流行的文本检索算法,广泛用于搜索引擎和文档相关性评分。它基于概率检索模型,旨在评估查询和文档之间的相关性。 核心公式 BM25 的公式如下: score ( D , Q ) …...
嵌入式Linux——文件类型
目录 普通文件 目录文件 目录文件的权限与管理 字符设备文件和块设备文件 符号链接文件 查看符号链接 删除符号链接 修改符号链接 管道文件 匿名管道(Anonymous Pipe) 匿名管道的特点: 使用示例: 命名管道(…...