【论文共读】【翻译】ShuffleNet v1:一种用于移动设备的极其高效的卷积神经网络

[原文地址] https://arxiv.org/pdf/1707.01083
[翻译]

0. 摘要

我们介绍了一种计算效率极高的CNN架构,称为ShuffleNet,该架构专为计算能力非常有限的移动设备(例如,10-150 MFLOPs)而设计。新架构利用了两个新操作,即逐点组卷积和信道随机,在保持准确性的同时大大降低了计算成本。在ImageNet分类和MS COCO目标检测上的实验表明,在40 MFLOPs的计算预算下,ShuffleNet的性能优于其他结构,例如,在ImageNet分类任务上,top-1误差(绝对值为7.8%)低于最近的MobileNet [12]。在基于 ARM 的移动设备上,ShuffleNet 的实际加速比 AlexNet 高出 ∼13×,同时保持了相当的精度。

1. 简介:

构建更深入、更大规模的卷积神经网络(CNNs)是解决主要视觉识别任务的主要趋势[21,9,33,5,28,24]。最准确的 CNN 通常有数百层和数千个通道 [9, 34, 32, 40],因此需要以数十亿次 FLOP 进行计算。本报告探讨了相反的极端情况:在数十或数百MFLOPs的非常有限的计算预算中追求最佳精度,重点关注无人机、机器人和智能手机等常见移动平台。请注意,许多现有的工作 [16, 22, 43, 42, 38, 27] 侧重于剪枝、压缩或低比特,代表“基本”网络架构。在这里,我们的目标是探索一种高效的基本架构,专门为我们所需的计算范围而设计。

我们注意到,由于密集 1 × 1 卷积的成本高昂,Xception [3] 和 ResNeXt [40] 等最先进的基本架构在极小的网络中效率降低。我们建议使用逐点群卷积减少 1 × 1 卷积的计算复杂度。为了克服群卷积带来的副作用,我们提出了一种新颖的通道洗牌操作,以帮助信息在特征通道之间流动。基于这两种技术,我们构建了一种高效的架构,称为 ShuffleNet。与 [30, 9, 40] 等流行的结构相比,对于给定的计算复杂度预算,我们的 ShuffleNet 允许更多的特征图通道,这有助于编码更多信息,对于非常小的网络的性能尤其重要。

我们在具有挑战性的ImageNet分类[4,29]和MS COCO对象检测[23]任务中评估了我们的模型。一系列的对照实验表明,我们的设计原则是有效的,并且比其他结构具有更好的性能。与最先进的架构MobileNet[12]相比,ShuffleNet在40 MFLOPs的水平上实现了显著的卓越性能,例如,在40 MFLOPs的水平上,ImageNet top-1误差绝对降低了7.8%。

我们还研究了真实硬件(即现成的基于 ARM 的计算核心)上的加速。与AlexNet [21]相比,ShuffleNet模型实现了∼13×的实际加速(理论加速为18×),同时保持了相当的精度。

2. 相关工作

高效的模型设计
近年来,深度神经网络在计算机视觉任务中取得了成功[21,36,28],其中模型设计起着重要作用。在嵌入式设备上运行高质量深度神经网络的需求日益增长,这促进了对高效模型设计的研究[8]。例如,GoogLeNet [33]与简单地堆叠卷积层相比,以更低的复杂性增加了网络的深度。SqueezeNet [14] 在保持准确性的同时显著减少了参数和计算量。ResNet [9, 10] 利用高效的瓶颈结构实现了令人印象深刻的性能。SENet [13] 引入了一个架构单元,该单元以较小的计算成本提高了性能。与我们并行,一个非常临近的工作[46]采用强化学习和模型搜索来探索高效的模型设计。所提出的移动NASNet模型与我们的对应ShuffleNet模型具有相当的性能(26.0% @ 564 MFLOPs,而ImageNet分类误差为26.3% @ 524 MFLOPs)。但是[46]没有报告在极小的模型上的结果(例如,复杂度小于150 MFLOPs),也没有评估移动设备上的实际推理时间。

分组卷积
分组卷积的概念最初是在AlexNet[21]中引入的,用于在两个GPU上分布模型,在ResNeXt [40]中已经很好地证明了其有效性。Xception[3]中提出的深度可分离卷积概括了Inception系列[34,32]中可分离卷积的思想。最近,MobileNet [12] 利用深度可分离卷积,在轻量级模型中获得了最先进的结果。我们的工作以一种新的形式推广了分组卷积和深度可分离卷积。

信道随机操作
据我们所知,尽管CNN库cuda-convnet [20]支持“随机稀疏卷积”层,相当于随机通道洗牌后跟一组卷积层,但在以往关于高效模型设计的工作中,信道洗牌操作的思想很少被提及。这种“随机洗牌”操作的目的各不相同,后来很少被利用。最近,另一项并发工作[41]也采用了这种思想进行两阶段卷积。然而,[41]并未专门研究通道洗牌本身的有效性及其在微小模型设计中的应用。

模型加速:
这个方向旨在加速推理,同时保持预训练模型的准确性。修剪网络连接 [6, 7] 或通道 [38] 可减少预训练模型中的冗余连接,同时保持性能。文献中提出了量化[31, 27, 39, 45, 44]和因式分解[22, 16, 18, 37],以减少计算中的冗余,加快推理速度。在不修改参数的情况下,通过FFT [25, 35]和其他方法[2]实现的优化卷积算法在实践中减少了时间消耗。Distilling [11] 将知识从大模型转移到小模型,这使得训练小模型变得更容易。

Channel Shuffle with two stacked group convolution

3. 方法

3.1 基于分组卷积的信道随机操作
现代卷积神经网络[30, 33, 34, 32, 9, 10]通常由具有相同结构的重复构建块组成。其中,最先进的网络,如Xception [3]和ResNeXt [40],在构建块中引入了高效的深度可分离卷积或群卷积,以在表示能力和计算成本之间取得很好的权衡。然而,我们注意到,这两种设计都没有完全考虑 1 × 1 卷积(在 [12] 中也称为逐点卷积),这需要相当大的复杂性。例如,在 ResNeXt [40] 中,只有 3 × 3 层配备了群卷积。因此,对于 ResNeXt 中的每个残差单元,逐点卷积占据了 93.4% 的乘法加法(基数 = 32,如 [40] 中所示)。在微小网络中,昂贵的逐点卷积导致满足复杂性约束的通道数量有限,这可能会严重损害精度。

为了解决这个问题,一个简单的解决方案是Y 通道稀疏连接,例如分组卷积,也在 1 层× 1 层上。通过确保每个卷积仅在相应的输入通道组上运行,分组卷积可显著降低计算成本。但是,如果多个组卷积堆叠在一起,则有一个副作用:某个通道的输出仅来自一小部分输入通道。图1(a)说明了两个堆叠群卷积层的情况。很明显,某个组的输出只与该组内的输入相关。此属性会阻止通道组之间的信息流动,并削弱表示性。

如果我们允许组卷积从不同的组获取输入数据(如图1(b)所示),则输入和输出通道将完全相关。具体来说,对于从前一个组层生成的特征图,我们可以先将每个组中的通道划分为几个子组,然后为下一层的每个组提供不同的子组。这可以通过通道随机操作高效而优雅地实现(图 1 (c)):假设一个卷积层,其输出有 g 个组,其输出有 g 个× n 个通道;我们首先将输出通道维度重塑为 (g, n),转置然后将其展平作为下一层的输入。请注意,即使两个卷积具有不同数量的组,该操作仍会生效。此外,信道随机播放也是可微分的,这意味着它可以嵌入到网络结构中进行端到端训练。

通道随机操作使得构建具有多个组卷积层的更强大的结构成为可能。在下一小节中,我们将介绍一个具有通道随机和组卷积的高效网络单元。
ShuffleNet Units

3.2 ShuffleNet 单元
利用信道洗牌操作的优势,我们提出了一种专为小型网络设计的新型ShuffleNet单元。我们从图2(a)中瓶颈单元[9]的设计原理开始。它是一个残余块。在其残差分支中,对于 3 × 3 层,我们在瓶颈特征图上应用了计算经济的 3 × 3 深度卷积 [3]。然后,我们用逐点组卷积替换前 1 层× 1 层,然后进行通道洗牌操作,形成一个 ShuffleNet 单元,如图 2 (b) 所示。第二个逐点组卷积的目的是恢复通道维度以匹配快捷路径。为简单起见,我们不会在第二层逐点层之后应用额外的通道随机播放操作,因为它会产生可比的分数。批量归一化 (BN) [15] 和非线性的使用与 [9, 40] 类似,不同之处在于我们没有像 [3] 所建议的那样在深度卷积后使用 ReLU。至于大步应用 ShuffleNet 的情况,我们只需进行两个修改(见图 2 (c)):(i) 在快捷路径上添加 3 × 3 的平均池化;(ii)用信道串联代替元素加法,这使得扩大信道维度变得容易,而额外的计算成本很小。

由于具有通道随机播放的逐点组卷积,可以有效地计算 ShuffleNet 单元中的所有分量。与ResNet [9](瓶颈设计)和ResNeXt [40]相比,在相同设置下,我们的结构复杂度更低。例如,给定输入大小 c × h × w 和瓶颈通道 m,ResNet 单元需要 hw(2cm + 9m2 ) FLOPs,而 ResNeXt 有 hw(2cm + 9m2/g) FLOPs,而我们的 ShuffleNet 单元只需要 hw(2cm/g + 9m) FLOPs,其中 g 表示卷积的组数。换句话说,给定计算预算,ShuffleNet 可以使用更广泛的特征图。我们发现这对于小型网络至关重要,因为小型网络通常没有足够的通道来处理信息。此外,在 ShuffleNet 中,深度卷积仅在瓶颈特征图上执行。尽管深度卷积通常具有非常低的理论复杂度,但我们发现很难在低功耗移动设备上有效实现,这可能是由于与其他密集操作相比,计算/内存访问比率较差。[3]中也提到了这样的缺点,它有一个基于TensorFlow [1]的运行时库。在 ShuffleNet 单元中,我们故意仅在瓶颈上使用深度卷积,以尽可能防止开销。

3.3 网络架构
基于 ShuffleNet 单元构建,我们在表 1 中展示了整体的 ShuffleNet 架构。所提出的网络主要由一堆 ShuffleNet 单元组成,这些单元分为三个阶段。每个阶段中的第一个构建块以步幅 = 2 应用。一个阶段内的其他超参数保持不变,对于下一个阶段,输出通道将增加一倍。与 [9] 类似,我们将瓶颈通道数设置为每个 ShuffleNet 输出通道数的 1/4 单位。我们的目的是提供一个尽可能简单的参考设计,尽管我们发现进一步的超参数调优可能会产生更好的结果。

在 ShuffleNet 单元中,组号 g 控制逐点卷积的连接稀疏性。表 1 探讨了不同的组数,我们调整了输出通道,以确保总计算成本大致保持不变 (∼140 MFLOPs)。显然,在给定的复杂度约束下,较大的组数会导致更多的输出通道(因此需要更多的卷积滤波器),这有助于编码更多信息,尽管由于相应的输入通道有限,它也可能导致单个卷积滤波器的退化。在第 4.1.1 节中,我们将研究这个数字在不同计算约束下的影响。

为了将网络定制为所需的复杂性,我们可以简单地在通道数量上应用比例因子 s。例如,我们将表 1 中的网络表示为“ShuffleNet 1×”,则“ShuffleNet s×”表示将 ShuffleNet 1× 中的滤波器数量缩放 s 倍,因此总体复杂度大约是 ShuffleNet 1× 的 s 2 倍。

ShuffleNet architecture

4. 实验

我们主要在ImageNet 2012分类数据集[29,4]上评估我们的模型。我们遵循 [40] 中使用的大部分训练设置和超参数,但有两个例外:(i) 我们将权重衰减设置为 4e-5 代替1e-4 并使用线性衰减学习率策略(从 0.5 降低到 0);(ii) 我们使用稍微不那么激进的规模增强进行数据预处理。[12]中也引用了类似的修改,因为这种小型网络通常遭受欠拟合而不是过拟合。在 4 个 GPU 上训练模型进行 3×105 次迭代需要 1 到 2 天,其批处理大小设置为 1024。作为基准测试,我们比较了ImageNet验证集上的单次裁剪top-1性能,即从256×输入图像裁剪224×224个中心视图并评估分类精度。我们对所有模型使用完全相同的设置,以确保公平的比较。

4.1 消融研究
ShuffleNet的核心思想在于逐点组卷积和通道洗牌操作。在本小节中,我们将分别评估它们

4.1.1 逐点群卷积
为了评估逐点组卷积的重要性,我们比较了相同复杂度的 ShuffleNet 模型,其组数范围从 1 到 8。如果组数等于 1,则不涉及逐点组卷积,然后 ShuffleNet 单元变为“类似 Xception”[3] 结构。为了更好地理解,我们还将网络的宽度扩展到 3 种不同的复杂度,并分别比较它们的分类性能。结果如表2所示。

从结果中,我们看到具有群卷积 (g > 1) 的模型始终比没有逐点组卷积 (g = 1) 的模型表现更好。较小的模型往往从组中获益更多。例如,对于 ShuffleNet 1×最佳条目 (g = 8) 比对应条目高 1.2%,而对于 ShuffleNet 0.5× 和 0.25×差距分别变为 3.5% 和 4.4%。请注意,对于给定的复杂性约束,群卷积允许更多的特征图通道,因此我们假设性能增益来自更广泛的特征图,这有助于编码更多信息。此外,较小的网络涉及更薄的特征图,这意味着它从扩大的特征图中受益更多。

表2还显示,对于某些模型(例如ShuffleNet 0.5×),当组数变得相对增加时(例如 g = 8),分类分数饱和甚至下降。随着组数的增加(因此特征图更宽),每个卷积滤波器的输入通道变得更少,这可能会损害表示能力。有趣的是,我们还注意到,对于较小的模型(如 ShuffleNet 0.25×较大的组数往往能始终如一地获得更好的结果,这表明更广泛的特征图为较小的模型带来了更多好处。
在这里插入图片描述
ShuffleNet vs. MobileNet

4.1.2 频道随机播放与无随机播放
随机操作的目的是使能多个组卷积层的跨组信息流。表 3 比较了有/没有通道随机播放的 ShuffleNet 结构(例如,组数设置为 3 或 8)的性能。评估是在三种不同的复杂程度下进行的。很明显,频道随机播放会持续提升不同设置的分类分数。特别是当组数相对较大(例如g = 8)时,具有信道随机性的模型明显优于对应模型,这表明了跨组信息交换的重要性

4.2. 与其他结构单元的比较
VGG [30]、ResNet [9]、GoogleNet [33]、ResNeXt [40] 和 Xception [3] 中的最新领先卷积单元在大型模型(例如 ≥ 1GFLOPs)中追求最先进的结果,但没有充分探索低复杂度条件。在本节中,我们将调查各种构建块,并在相同的复杂性约束下与 ShuffleNet 进行比较。为了公平比较,我们使用表 1 中所示的整体网络架构。我们将第 2-4 阶段的 ShuffleNet 单元替换为其他结构,然后调整通道数量以确保复杂性保持不变。我们探索的结构包括:

  • 像VGG一样。遵循VGG网络[30]的设计原则,我们使用两层3×3卷积作为基本构建块。与 [30] 不同,我们在每次卷积后添加一个批量归一化层 [15],以使端到端训练更容易。
  • ResNet的。我们在实验中采用了“Bottleneck”设计,这在[9]中得到了更有效的证明。与 [9] 相同,瓶颈比率 1 也是 1
  • Xception 类似网络。[3]中提出的原始结构涉及到不同阶段的花哨设计或超参数,我们发现在小型模型上很难进行公平的比较。取而代之的是,我们从 ShuffleNet 中删除了逐点组卷积和通道洗牌操作(也等效于 g = 1 的 ShuffleNet)。派生的结构与[3]中的“深度可分离卷积”思想相同,在这里称为类似Xception的结构
  • ResNeXt。我们使用 [40] 中建议的基数 = 16 和bottleneck 比率 = 1 : 2 的设置。我们还探索了其他设置,例如 bottleneck 比率 = 1:4,并得到了类似的结果。

我们使用完全相同的设置来训练这些模型。结果如表4所示。我们的 ShuffleNet 模型在不同的复杂性下明显优于大多数其他模型。有趣的是,我们发现特征图通道与分类精度之间存在经验关系。例如,在38 MFLOPs复杂度下,类VGG、ResNet、ResNeXt、Xception、ShuffleNet模型的Stage 4(见表1)的输出通道分别为50、192、192、288、576,与准确性的提高。由于 ShuffleNet 的高效设计,我们可以在给定的计算预算下使用更多通道,因此通常会产生更好的性能.

请注意,上述比较不包括GoogleNet或Inception系列[33,34,32]。我们发现为小型网络生成这样的 Inception 结构并非易事,因为 Inception 模块的原始设计涉及太多的超参数。作为参考,第一个GoogleNet版本[33]具有31.3%的top-1误差,代价为1.5 GFLOPs(见表6)。更复杂的Inception版本[34,32]更准确,但是,复杂性显着增加。最近,Kim等人提出了一种名为PVANET[19]的轻量级网络结构,该结构采用Inception单元。我们重新实现的PVANET(输入大小为224×224)的分类误差为29.7%,计算复杂度为557 MFLOPs,而我们的ShuffleNet 2x模型(g = 3)在524 MFLOPs的计算复杂度为26.3%(见表6)。

4.3 与MobileNets和其他框架的比较
最近,Howard等人提出了MobileNets[12],主要关注移动设备的高效网络架构。MobileNet 从 [3] 中采用了深度可分离卷积的思想,并在小型模型上取得了最先进的结果

表 5 比较了各种复杂度级别的分类分数。很明显,我们的 ShuffleNet 模型在所有复杂性方面都优于 MobileNet。尽管我们的 ShuffleNet 网络是专门为小型模型(< 150 MFLOP)设计的,但我们发现它仍然比 MobileNet 更好.

4.4. 泛化能力
为了评估迁移学习的泛化能力,我们在 MS COCO 对象检测任务上测试了我们的 ShuffleNet 模型 [23]。我们采用 Faster-RCNN [28] 作为检测框架,并使用公开发布的 Caffe 代码 [28, 17] 进行训练,默认设置如下。与[12]类似,模型在COCO train+val数据集上训练,不包括5000张minival图像,并在minival集上进行测试。表 7 显示了在两种输入分辨率下训练和评估的结果的比较。比较 ShuffleNet 2× 与MobileNet, 其复杂度为(524 对 569 MFLOP),我们的 ShuffleNet 2× 在两种分辨率上都大大超过了 MobileNet;我们的 ShuffleNet 1× 在 600× 分辨率上也取得了与 MobileNet 相当的结果,但复杂度降低了 ∼4×。我们推测,这一显著的收益部分归功于 ShuffleNet 的简单架构设计,没有花里胡哨。

4.5. 实际加速评估
最后,我们评估了ShuffleNet模型在具有ARM平台的移动设备上的实际推理速度。尽管具有较大组数(例如 g = 4 或 g = 8)的 ShuffleNet 通常具有更好的性能,但我们发现它在当前的实现中效率较低。从经验上讲,g = 3 通常在精度和实际推理时间之间有适当的权衡。如表8所示,该测试利用了三种输入分辨率。由于内存访问和其他开销,我们发现理论复杂度每降低 4×通常会导致实现的实际加速 ∼2.6×。尽管如此,与AlexNet [21]相比,我们的ShuffleNet 0.5×模型在相当的分类精度下(理论加速比为18×)仍然实现了∼13×的实际加速,这比以前的AlexNet级别的模型或加速方法(如[14, 16, 22, 42, 43, 38])要快得多。

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

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

相关文章

Ubuntu 22.04.4 LTS (linux) Tomcat 下载 安装配置详细教程

1 官网下载 下载链接 2 ubuntu 服务器安装 #下载 wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.91/bin/apache-tomcat-9.0.91.tar.gz #解压 tar zxvf apache-tomcat-9.0.91.tar.gz sudo mv apache-tomcat-9.0.91/ /data/tomcat #配置环境变量 sudo vi /etc/profil…

WebGoC题解(13) 狐猬编程:GoC L4 结业测试 第4题 找木柴

题目描述 小明今天找了n跟木柴&#xff0c;但是木柴太多了&#xff0c;小明只能拿走m根木柴&#xff0c;小明希望拿走的木柴都是剩下的木柴中最长的&#xff0c;小明还画出以下图形 例如 输入 5 3 10 20 30 40 50 小明要拿走30 40 50 这3根木柴 从大到小画出以下图形 矩形的宽…

linux cpu 占用超100% 分析。

感谢: https://www.cnblogs.com/wolfstark/p/16450131.html 总结&#xff1a; 查看进程中各个线程占用百分比 top -H -p <pid> 某线程100%了 说明 任务处理不过来 会卡 但是永远不可能超100% 系统监视器里面看到的是 所有线程占用的 总和会超100%。 所以最好的情况是&…

MATLAB基础:字符串、元胞数组

今天我们继续学习MATLAB中的字符串、元胞和结构 字符串 由于MATLAB是面向矩阵的&#xff0c;所以字符串的处理可以用矩阵的形式实现 字符串的赋值与引用 假设变量a&#xff0c;将用单引号引起来的字符串赋值给它&#xff0c; a清心明目, b(a[4;-1;1]) 在这里&#xff0c;…

如何检查我的网站是否支持HTTPS

HTTPS是一种用于安全通信的协议&#xff0c;是HTTP的安全版本。HTTPS的主要作用在于为互联网上的数据传输提供安全性和隐私保护。通常是需要在网站安装部署SSL证书来实现网络数据加密传输&#xff0c;安全加密功能。 那么如果要检查你的网站是否支持HTTPS&#xff0c;可以看下…

云计算实训11——web服务器的搭建、nfs服务器的搭建、备份静态文件、基于linux和windows实现文件共享

一、搭建web服务器 1.关闭firewall和selinux 关闭防火墙 systemctl stop firewalld systemctl disable firewalld 停用selinux setenforce 0 配置文件中让sellinux不再启动 vim /etc/selinux/config SELINUXpermissive 2.编辑dns配置文件 vim /etc/resolv.conf nameserver 114.…

Go基础编程 - 11 - 函数(func)

接口&#xff08;interface&#xff09; 函数1. 函数定义1.1. 函数名1.2. 参数列表1.3. 返回值列表 2. 匿名函数3. 闭包、递归3.1 闭包3.1.1 函数、引用环境3.1.2 闭包的延迟绑定3.1.3 goroutine 的延迟绑定 3.2 递归函数 4. 延迟调用&#xff08;defer&#xff09;4.1 defer特…

2024-07-22 Unity AI行为树1 —— 框架介绍

文章目录 1 行为树2 行为树驱动方式3 行为树结点分类3.1 控制节点3.2 执行节点 4 行为树与状态机比较 本文章参考 B 站唐老狮 2023年直播内容。 点击前往唐老狮 B 站主页。 1 行为树 ​ 行为树&#xff08;Behavior Tree&#xff0c;BT&#xff09;在游戏 AI 中是一种用于控制…

微软蓝屏事件:网络安全与系统稳定性的反思与前瞻

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

javascript 的执行上下文与作用域

目录 1. 初步了解 上下文&#xff08;context&#xff09;2. 全局上下文(global context)3. 上下文栈 (context stack)4. 作用域链( scope chain)5. 作用域(scope)6. 作用域链增强7. 变量声明7.1 var 声明变量7.2 let 声明变量7.3 const 常量声明 1. 初步了解 上下文&#xff0…

轨迹优化 | 基于ESDF的共轭梯度优化算法(附ROS C++/Python仿真)

目录 0 专栏介绍1 数值优化&#xff1a;共轭梯度法2 基于共轭梯度法的轨迹优化2.1 障碍约束函数2.2 曲率约束函数2.3 平滑约束函数 3 算法仿真3.1 ROS C实现3.2 Python实现 0 专栏介绍 &#x1f525;课程设计、毕业设计、创新竞赛、学术研究必备&#xff01;本专栏涉及更高阶的…

CAS乐观锁原理

1、什么是CAS&#xff1f; compare and swap也就是比较和交换&#xff0c;他是一条CPU的并发原语。 他在替换内存的某个位置的值时&#xff0c;首先查看内存中的值与预期值是否一致&#xff0c;如果一致&#xff0c;执行替换操作。 这个操作是一个原子性操作。 Java中基于Un…

手机免费恢复照片的软件有哪些?这2个工具来帮忙

照片是我们情感的载体&#xff0c;是记忆的碎片。它们无声地诉说着过去的故事&#xff0c;记录着生活中的点点滴滴。但意外常常是突如其来的&#xff0c;当发现手机照片丢失时&#xff0c;我们往往心痛不已。 不用担心&#xff0c;这场看似绝望的危机&#xff0c;实则有解决之…

Sql Server缓冲池、连接池等基本知识(附Demo)

目录 前言1. 缓存池2. 连接池3. 彩蛋 前言 基本的知识推荐阅读&#xff1a; java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&#xff09;Mysql优化高级篇&#xff08;全&#xff09;Mysql底层原理详细剖析常见面试题&#xff08;全&#xff09; 1…

【VSCode】安装 【ESP-IDF】插件及【ESP32-S3】新建工程和工程配置

一、搭建基础工程 二、基础工程的文件架构解析 三、调试相关工具介绍 1、串口下载2、JTAG 下载与调试 四、工程的文件架构解析 五、基础工程配置 一、搭建基础工程 在 VS Code 中新建 ESP-IDF 基础工程的步骤如下&#xff1a; 1、启动 VS Code 并打开命令面板 按下“Ctrl…

逆向案例二十八——某高考志愿网异步请求头参数加密,以及webpack

网址&#xff1a;aHR0cDovL3d3dy54aW5nYW9rYW90Yi5jb20vY29sbGVnZXMvc2VhcmNo 抓包分析&#xff0c;发现请求头有参数u-sign是加密的&#xff0c;载荷没有进行加密&#xff0c;直接跟栈分析。 进入第二个栈&#xff0c;打上断点&#xff0c;分析有没有加密位置。 可以看到参数…

Chapter17 表面着色器——Shader入门精要学习

Chapter17 表面着色器 一、编译指令1.表面函数2.光照函数3.其他可选参数 二、两个结构体1.Input 结构体&#xff1a;数据来源2.SurfaceOutput 三、Unity背后做了什么四、表面着色器的缺点 一、编译指令 作用&#xff1a;指明该表面着色器的 表面函数 和 光照函数&#xff0c;并…

DPDK收包流程和Linux内核收包流程对比

DPDK 网卡收包流程-腾讯云开发者社区-腾讯云NIC 在接收到数据包之后&#xff0c;首先需要将数据同步到内核中&#xff0c;这中间的桥梁是 rx ring buffer。它是由 NIC 和驱动程序共享的一片区域&#xff0c;事实上&#xff0c;rx ring buffer 存储的并不是实际的 packet 数据&a…

【Gin】精准应用:Gin框架中工厂模式的现代软件开发策略与实施技巧(上)

【Gin】精准应用&#xff1a;Gin框架中工厂模式的现代软件开发策略与实施技巧(上) 大家好 我是寸铁&#x1f44a; 【Gin】精准应用&#xff1a;Gin框架中工厂模式的现代软件开发策略与实施技巧(上)✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 前言 本次文章分为上下两部分&…

【RaspberryPi】树莓派系统UI优化

接上文&#xff0c;如何去定制一个树莓派的桌面系统&#xff0c;还是以CM4为例。 解除CM4上电USB无法使用问题 将烧录好的tf卡通过读卡器插入到电脑上&#xff0c;进入boot磁盘&#xff0c;里面有一个Config文件&#xff0c;双击用记事本打开&#xff0c;在【pi4】一栏里加入一…