IEEE--DSConv: Efficient Convolution Operator 论文翻译

论文地址:https://arxiv.org/pdf/1901.01928v1.pdf

目录

摘要

1 介绍

2 相关工作

3 DSConv层

4 量化过程

5 分布偏移

6 优化推断

7 训练

8 结果

8.1 ImageNet

8.2 内存和计算负载

8.3 转移性

9 结论


摘要

        我们引入了一种卷积层的变体,称为DSConv(分布偏移卷积),可以轻松替换标准神经网络架构,实现较低的内存使用和更高的计算速度。DSConv将传统的卷积核分解为两个组成部分:可变量化核(VQK)和分布偏移。通过仅在VQK中存储整数值,同时通过应用基于卷积核和通道的分布偏移,实现较低的内存使用和较高的速度。我们在ImageNet上对ResNet50和34以及AlexNet和MobileNet进行了DSConv的测试。通过将浮点运算替换为整数运算,我们在卷积核的内存使用上实现了高达14倍的减少,并在操作速度上实现了高达10倍的加速。此外,与其他量化方法不同,我们的工作允许对新任务和数据集进行一定程度的重新训练。

1 介绍

        卷积神经网络在传统上困难的计算机视觉任务中取得了成功,例如图像分类和目标检测。在AlexNet的突破之后,许多新的拓扑结构已被创建,以在ILSVRC中实现高准确度。这些网络的成功引起了人们对于不仅如何实现这一点的关注,还关注于它能够以多快、内存效率高的方式运行。这些模型以拥有数百万参数而闻名,即使使用GPU进行计算,花费的时间和存储空间也比许多应用所期望的要多。

        在运行卷积神经网络时,大部分内存和计算工作都花费在卷积层上,例如ResNet 50的时间/内存的90%以上。这意味着为了使网络运行更快、更高效,必须改进卷积层的计算负载。

        考虑到这一点,我们提出了一种新型的卷积层,我们称之为分布偏移卷积(DSConv)。这种类型的层设计有两个主要目标:(i) 显著改善标准卷积层的内存效率和速度;(ii) 它应该是标准卷积的即插即用替代品,可以直接用于任何卷积神经网络,包括推理和训练。我们通过将传统的卷积核分解为两个组成部分来实现这一目标。其中一个是仅包含整数值的张量,不可训练,并根据预训练网络中浮点(FP)权重的分布计算得出。另一个组成部分由两个分布偏移张量组成,它们将量化张量的权重定位在模拟原始预训练网络分布的范围内:一个按卷积核进行分布偏移,另一个按通道进行分布偏移。这些权重可以进行重新训练,使网络适应新的任务和数据集。

        因此,我们的主要贡献是一种新型的卷积层,我们展示其内存使用仅为标准卷积的1/10,速度高达标准卷积的10倍,通常在准确性上几乎没有损失,并且与大多数相关方法不同,仍然可以用于新任务和数据集的训练。

        论文的其余部分结构如下:第2节详细阐述了文献综述;第3节解释了DSConv的工作原理及其背后的思想;第4和第5节演示了DSConv组件的值是如何初始化的;第6和第7节分别详细说明了推断和训练的执行方式;第8节详细阐述了我们方法的结果;第9节总结了本文。

2 相关工作

        已经付出了大量努力来使神经网络变得更小和/或更快。以下工作与我们的研究相关且相关:

        内存节省方法: 这类工作主要关注于使网络变得更轻而不是更快。有许多方法。韩等人的深度压缩[3]涉及修剪、权重聚类和哈夫曼编码,以减小网络的大小,在VGGNet中实现了内存使用减少了35到49倍。请注意,大多数节省是在全连接(FC)层中完成的,因为它们高度冗余。陈等人的HashedNets[1]等其他方法使用哈希表和共享相似权重来减少参数数量,从而减小网络的大小。由于这些方法专注于减小网络的大小,它们不会增加卷积层计算的速度,因为它们在前向传递中仍然使用大致相同数量的浮点运算。即使[3]中的修剪使FC层运行速度更快,大多数最新的体系结构在其拓扑结构中并不使用许多FC层。而且,一旦压缩,它们对于重新训练来说不够灵活,有时甚至无法重新训练。FlexPoint [10]是另一种通过以某种方式共享浮点数的指数来减小精度至16+5而不损失精度的方法。这也可能对速度产生一些影响:例如,在适当的硬件实现中,涉及大小为16位的尾数的操作可以使用固定点算术进行。这是以处理共享指数的值、实现一种新的数字格式以及在专门设计的硬件中运行的代价为代价的。

        内存节省和快速网络: 一种增加速度和内存效率的有趣方式是将权重从FP32数值量化为另一种格式。值得注意的是,量化神经网络(QNN)[5]和二值神经网络(BNN)[2]通过使用可变位数已经解决了这个问题。BNN已成功地将一位网络应用于MNIST、CIFAR-10和SVHN等数据集,而QNN则表明AlexNet实现的一位网络在ImageNet中几乎不损失准确性。朱等人的训练三值量化(TTQ)[15]也取得了类似的结果。这些方法的缺点是它们在训练时需要很长时间(BNN需要500个epochs),并且据我们所知,极端情况下使用一位网络在较大的网络(如ResNet50或ResNet101)中并没有被证明有效。它们在适应新任务或数据集方面也较为不灵活。

        快速网络: 这些方法通常旨在通过减少参数和操作的数量来开发快速的神经网络架构。MobileNet [4]特别使用深度可分离卷积使操作既快速又内存高效。ShuffleNet [14]是另一种方法,它使用通道重排和组卷积来减少计算成本。尽管已经开发出成功的方法,但它们要么改变网络的架构,改变卷积的计算方式,要么使其难以适应其他网络。

        我们的方法是为了使系统能够采用一种简单即插即用的解决方案,而无需对架构或卷积的工作方式进行重大更改。

3 DSConv层

        DSConv的总体目标是通过使用量化和分布偏移来模拟卷积层的行为。DSConv的设置如图1所示。为了方便和符号表示,让原始的卷积张量的大小为(cho, chi, k, k),其中cho是下一层的通道数,chi是当前层的通道数,k是卷积核的宽度和高度。DSConv被分为两个不同的组件:

  • 可变量化核(VQK): 该张量仅包含可变位数的整数值,大小与原始卷积张量相同(cho, chi, k, k)。参数值被设置为从原始浮点模型量化的值,一旦设置就无法更改。这是DSConv的量化组件,它允许执行更快且内存高效的乘法运算。
  • 分布偏移: 该组件的目的是通过使用量化和分布偏移来模拟卷积核的分布。它分为两个部分,即核分布偏移器(KDS)和通道分布偏移器(CDS)。
    • 核分布偏移器(KDS): 它在VQK的每个(1, BLK, 1, 1)切片中进行分布偏移,其中BLK是块大小的超参数。张量的大小为2 · (cho, CEIL(chi/BLK), k, k),其中CEIL(x)是向上取整运算符,它保存单精度值。
    • 通道分布偏移器(CDS): 它在每个通道中进行分布偏移,即在每个(1, chi, k, k)切片中进行分布偏移。这自然是一个大小为2 · (cho)的单精度数字的张量。

        例如,给定一个原始的单精度张量大小为(128, 128, 3, 3),并设置位数的超参数为2位,块大小为64,VQK将保存2位整数,大小为(128, 128, 3, 3),核移位器保存FP32数,大小为2 · (128, 2, 3, 3),通道移位器保存FP32数,大小为2 · (128)。在这个例子中,卷积核的大小被减小到其原始大小的7%。

        使用这个设置,VQK充当一个先验,捕捉了该切片应该提取的特定类型特征的本质。使网络执行例如正确分类,只是将VQK放置在数值一致性的正确范围内的问题,这取决于网络已经在哪个数据集上进行了训练或微调。

        接下来的部分详细说明了DSConv的每个组件的值是如何初始化的,以及如何设置优化推断和易于实现的训练过程。

4 量化过程

        量化函数以网络要量化的位数作为输入,并使用带符号整数表示进行存储,使用2的补码。一般来说,对于位数为b的数,我们有以下关系:

        其中wq表示张量中每个参数的值。

         这是通过首先缩放每个卷积层的权重,使得原始权重w的最大绝对值匹配上述量化约束的最大值来实现的。在此步骤之后,所有权重都被量化为最近的整数。新的权重wq然后存储为整数值在内存中,以便在训练和推断中后续使用。

        请注意,此过程在每个块中完成。这意味着不同的块将具有不同的移位因子,这允许灵活的架构。直观地说,移位因子选择量化权重的整数值的范围,使其中一些在某些范围内更相关,而另一些对于特定层而言则不太相关。

5 分布偏移

        正如在第3节中解释的那样,分布偏移的目的是通过移动VQK值,使输出匹配原始权重张量的值。这通过卷积核的分布偏移(KDS)和通道的分布偏移(CDS)来完成,从现在起分别用ξ表示缩放和ξs表示偏置,以及φ和φs。良好的初始值对于两者都是必要的,因为它将网络放置在最优值附近,只需进行微调即可达到最大准确性。

         计算张量的初始值的两种可能方法是:(i) 最小化KL散度,该方法试图找到原始权重分布和核分布偏移之间的最小信息损失;或者 (ii) 最小化L2范数(欧几里得距离)将具有参数最接近原始网络最优值的解释。

        通过最小化KL散度,我们强调了VQK在经过卷积核分布偏移后应具有与原始权重相似的分布的思想。首先,我们假设ξs最初为零,因为量化过程仅使用了一个缩放因子来评估VQK的整数值。我们通过对移动后的VQK和原始分布的softmax值进行操作来执行此操作:

         然后我们最小化KL散度损失:

         我们使用梯度下降来最小化损失函数,从而得到张量ξ中每个参数的值。 对于找到ξ的值的另一种方法是通过最小化L2范数。核移位器张量ξ的值被初始化,以便在元素逐个相乘后的结果尽可能接近原始值。在数学上,这可以表示为:

        直观地说,使得与原始局部最小值偏离最小的ξ值是最小化L2范数(欧几里得距离)的值。因此,为了计算ξ的初始值,我们执行:

        经验上,两种方法(KL散度和L2范数)返回的大多数ξ值在第三位小数点上相同。这表明找到ξ的这两种解释是一致的。在第8节进行的实验中,我们采用了L2范数初始化,因为它是一种分析方法而不是迭代方法。

        通道移位器的值在乘法器处都被初始化为1,在偏置处都为0,因为最初的量化过程仅对VQK应用了缩放,并且没有对通道进行任何更改。从经验上看,通道移位器 acts 作为后验的 shifter,微调模型,使得 DSConv 结束时的激活与原始卷积后某个特定数据集的激活相同。由于最初没有训练,我们对激活的值没有足够的信息来调整此值。后来,如果需要微调以恢复一些准确性,此值将对该过程做出最大贡献。

        图2显示,当使用此方法时,应用于核分布偏移的VQK的分布强烈地类似于原始权重的分布。即使在低位数上,图中显示3位数。可以使用其他方法初始化核移位值,而无需对架构进行进一步更改(因为这是一个局部更改)。 

       

图2. 对ResNet50卷积核块进行直方图处理的结果。可以看到,即使只使用3位的量化权重和块大小为128,得到的权重Wr与原始权重W的值非常相似。

6 优化推断

        推断的数据流程如图3所示。值得指出的是操作顺序略有不同。与移动VQK不同,我们首先将其与输入张量相乘。这意味着大部分操作将以整数值而不是浮点数值进行计算,可以实现2到10倍的加速[13, 7],具体取决于所使用的硬件,并采用8位操作。使用这种顺序可以使结果在数学上等同于第3节中描述的结果,同时使硬件能够利用整数运算,而不必使用浮点数乘法。

        给定块大小为BLK,当chi是BLK的倍数时,此方法将执行比其原始对应物少BLK倍的FP乘法,例如,对于块大小为128,将仅通过将卷积层更改为DSConv,就可以显著减少2个数量级的FP乘法。

        通道分布移位将在执行给定内核的所有卷积的总和后应用。请注意,为了进一步提高内存和计算能力,如果模型在卷积运算符之后包含 Batch Normalization 层[6],则通道移位可以合并到其中。如果没有,通道分布移位器的大小通常比卷积运算符小数百倍,与架构的大小相比,其内存和计算开销将可以忽略不计。

图3. 推断数据路径。该过程对所有卷积中的每个核心都进行了重复。请注意,第一次乘法是在整数操作中完成的,而第二次是在浮点数中完成的。

7 训练

        在进行训练时,我们可以按照第3节中描述的操作顺序进行框架化。正如图4所示,DSConv可以通过使用扩展操作符和Hadamard(逐元素)乘法轻松转化为传统的卷积操作符。

        图4. 训练数据路径。该过程针对卷积层中的每个核心重复进行,并将得到的张量wr用于与输入x进行卷积。请注意,相似颜色的突出显示的框框都共享ξi的相同值。这可以直接在Tensorflow和PyTorch中实现。

        由于训练很可能在GPU上使用TensorFlow和PyTorch等深度学习框架进行计算,因此计算前向传播的简便方法至关重要,因此可以轻松地在大多数常用的框架中实现。

        使用这个过程,反向传播也可以轻松计算。借助图5的帮助,可以显示反向传播简单地分解为三个简单的操作。还应该注意,VQK核是不可训练的,因此不需要计算∂wr/∂w的值。相反,只需要计算∂ξr/∂ξ,其大小显著小于∂wr/∂w。

图5. 在训练过程中的DSConv层结构。首先,分布偏移ξ被扩展为与权重张量W相同的张量大小,得到张量ξR。然后执行Hadamard乘积以获得有效的结果权重Wr。这还显示了在反向传播过程中计算每个参数的导数。 

        反向传播的导数可以使用现成的导数运算进行计算:

        在上述方程中,J是单个元素张量(在(i, j, k, l)处为1,在其他地方为0),运算符 ⊙ 是Hadamard乘积运算符。卷积操作符的导数可以在任何主要的框架中找到并得到广泛应用。可以看出,DSConv可以通过少量修改轻松地在任何现有的神经网络框架中实现。

8 结果

        我们在PyTorch中实现了DSConv,并用DSConv替代了许多架构中的卷积操作符,以评估其在精调和非精调情况下的性能。最后,我们还评估了这种方法的局限性,并展示了与第2节中引用的其他方法的比较。

        在下面的子节中,我们将呈现表格,说明了DSConv在ResNet50、ResNet34、MobileNetV2和AlexNet等架构中的应用。我们还展示了预训练的DSConv可以通过在仅进行一次微调的情况下将其调整到其他数据集上,据我们所知,之前在量化网络方面的工作中并没有这样的做法。

8.1 ImageNet

        表1显示了在ResNet中,对于各种比特和块大小值,模型在进行分布偏移适应和不适应时的准确性。

        表1. 应用DSConv在ResNet上的准确性结果,包括有和没有重新训练的情况。每个架构(50和34)左侧的列显示了没有进行微调的结果。每个架构右侧的列显示了在使用Adam Optimizer [8]进行1轮微调后的DSConvs结果,学习率为10^-5。

        可以看到,在许多情况下,即使对于4位权重而言,在没有进行微调的情况下,准确性的损失也是可忽略的。 对于极低的比特长度,比如2位权重,仅使用学习率为10^-5的Adam Optimizer [8]在块大小为8的情况下,对模型进行仅一轮的重新训练就能够恢复大部分准确性。

         需要指出的一个细节是,只有DSConv是可训练的,全连接层被冻结,如果存在,批标准化层也被冻结。

        正如预期的那样,随着块大小的减小,模型的准确性增加,随着比特大小的增加,准确性也增加。对于4位的结果特别有趣,因为在没有微调的情况下,该模型的准确性仅相差原始准确性的5个百分点。

         为了完整性和与先前方法进行比较,我们还在AlexNet [9]中测试了我们的工作。结果总结在表2中。可以看到,我们的工作可以通过仅进行一轮的重新训练显著恢复由量化导致的准确性损失。

表2. 使用不同比特大小对ImageNet进行DSConv微调的结果。这些结果仅在进行1轮重新训练后获得。

8.2 内存和计算负载

        当比较DSConv与普通卷积时,我们可以计算执行多少整数乘法以及在切换到DSConv时会节省多少内存。 下面的公式给出了从普通卷积切换到DSConv会节省多少内存的比例:

        对于足够大的块大小(BLK),在其中通道分布转换器可以与批标准化层合并,或者当偏移值的偏差可以忽略不计时,我们可以得到以下近似值:

        从方程(8)可以看出,即使对于相对较大的比特数,也可以实现显著的减少。例如,对于具有6位、BLK = 128和chi = 256的模型,我们得到张量仅占原始模型大小的20%。当位数降至3时,缩小的模型仅占原始模型大小的11%。

         表3详细列出了我们的方法相对于MobileNetV1 [4]和MobileNetV2 [12]的计算负载、内存需求和准确性。正如在第2节中提到的,这些网络设计用于在CPU上执行比普通卷积操作符更少的计算。它们还自然占用更少的内存。尽管如此,表3显示了我们的方法在使用更准确且更大的网络(如ResNet34和ResNet50)时,甚至比MobileNet占用更少内存。它还显示了我们执行的浮点乘累加操作明显较少,尽管我们需要执行相当多的整数操作。

表3. DSConv应用于ResNet34和ResNet50与其他网络(特别是MobileNet)的比较。可以看到,即使应用于ResNet34和ResNet50,我们的方法比MobileNet更轻便且更准确。一个重要的观点是,尽管我们的模型增加了更多的参数,但总体大小要小得多,因为大多数参数的比特长度较低。需要指出的重要一点是,由于VQK是不可训练的,可训练参数要少得多。报告的准确性是我们自己实现的MobileNetV2的结果。结果略低于[12]中的结果,但它是我们的DSConv网络的起点。 

        值得指出的是,我们的方法还可以在MobileNet之上运行,以实现更好的结果,并在这种情况下执行比纯浮点操作更多的整数操作,这应该比传统卷积更快。

        表4显示了在AlexNet中使用DSConv与Deep Compression [3]相比的内存节省情况,Deep Compression是第2节中提到的方法之一。请注意,即使我们的工作并非专门设计用于压缩网络,但它仍能够在卷积层实现与专门设计的压缩方法一样低的压缩比。值得注意的是,DSConv可以在许多这些方法之上运行。

表4. 我们的方法与DeepCompression [3],一种最先进的压缩模型的比较。可以看到,尽管我们仍然能够保持灵活性并能够在其他数据集上重新训练(如第8.3节所示),我们的模型可以与他们的模型匹配。 

8.3 转移性

        鉴于在ImageNet上预训练的ResNet,我们还测试了在更改数据集并使网络适应分类其他数据集时的性能。我们使用了在ImageNet上微调的DSConv ResNet模型,并将最后的全连接层更改为仅输出10个类别。表5显示了对网络不同部分进行训练的结果。

        我们采用了具有不同比特长度和块大小为128的ResNet50模型,并将最后的FC层更改为仅输出10个值。然后,我们通过重新训练不同的参数(FC层和FC+DSConv层)将其转移到CIFAR10,以查看它们对该过程的影响。在所有情况下,我们使用学习率为10^-5的Adam Optimizer [8]进行了重新训练。

        表5总结了结果。在使用3位权重对DSConv层的所有学习参数进行重新训练时,我们实现了86.23%的TOP1准确性。显然,比特长度和块大小的超参数可以更改以实现准确性、内存使用和速度之间的理想权衡。 据我们所知,这是第一篇展示量化模型可以快速转移到其他数据集的论文,而不需要在体系结构上进行任何修改,除了必要的最后全连接层。 FC层仅部分地对重新训练产生影响表明,权重的分布最终是网络中相关部分。由于VQK是固定的,结果表明它很好地近似了特征提取分布应该看起来像什么。通过仅移动整数值的分布,仅经过一轮后就恢复了50%以上的准确性。这表明分类是根据给定数据集改变特征提取操作范围的问题。

表5. 将在ImageNet上训练的ResNet50 DSConv模型迁移到CIFAR10的迁移学习结果。这些模型与表1中的微调列中使用的相同模型相同,只是将最后的层替换为具有10个输出通道的全连接层。

9 结论

        我们提出了DSConv,这是传统卷积张量的替代品。通过量化权重并找到固定整数权重的最佳分布偏移,它改进了计算复杂度和内存使用。

         当应用于相对较低位数的权重(例如4位整数)时,它不需要任何重新训练即可在ResNet等网络上达到准确性在5%范围内。如果提供训练数据,我们展示了在仅使用VQK中的2位数字的情况下,可以在大型架构(如Resnet50或Resnet101)上取得良好的结果。

         与MobileNetV1 [4]和MobileNetV2 [12]等方法进行比较,这些方法在速度和内存方面都取得了良好的结果,我们的方法是互补的,因为我们可以在它们的网络中实现这个卷积。这可以在非常具有挑战性的数据集(如ImageNet)中实现最先进的速度。

        我们还展示了我们的方法可以轻松用于迁移学习和领域自适应。我们通过使用在ImageNet上使用DSConv微调的模型,并将任务更改为对CIFAR10图像进行分类来证明这一点,仅使用VQK中3位长度的数字和块大小为128,即可实现86.23%的TOP1准确性。

        DSConv可以轻松替代传统的卷积操作符,它是自包含的,提供了在准确性、内存使用和灵活性之间的可变权衡。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【LLM】0x00 大模型简介

0x00 大模型简介 个人问题学习笔记大模型简介LLM 的能力:LLM 的特点: LangChain 简介LangChain 核心组件 小结参考资料 个人问题 1、大模型是什么? 2、ChatGPT 在大模型里是什么? 3、大模型怎么用? 带着问题去学习&a…

【分布式】CAP理论详解

一、CAP理论概述 在分布式系统中,CAP是指一组原则,它们描述了在网络分区(Partition)时,分布式系统能够提供的保证。CAP代表Consistency(一致性)、Availability(可用性)和…

【Java 进阶篇】JQuery 案例:全选全不选,为选择添彩

在前端的舞台上,用户交互是一场精彩的表演,而全选全不选的功能则是其中一段引人入胜的剧情。通过巧妙运用 JQuery,我们可以为用户提供便捷的全选和全不选操作,让页面更富交互性。本篇博客将深入探讨 JQuery 中全选全不选的实现原理…

<MySQL> 查询数据进阶操作 -- 聚合查询

目录 一、聚合查询概述 二、聚合函数查询 2.1 常用函数 2.2 使用函数演示 2.3 聚合函数参数为*或列名的查询区别 2.4 字符串不能参与数学运算 2.5 具有误导性的结果集 三、分组查询 group by 四、分组后条件表达式查询 五、MySQL 中各个关键字的执行顺序 一、聚合查询…

232.用栈实现队列(LeetCode)

思路 思路:利用两个栈实现队列先进先出的特性,先将元素导入一个栈内 模拟出队时,则将所有元素导入另一个栈内,此时元素顺序被反转过来,只需要取栈顶数据即可 那我们就可以将两个栈的功能分开,一个专门入pus…

多机器人群体的任务状态与机器人状态同步设计思路

背景技术 近年来,随着科学技术的发展需要,机器人技术不断进步。面临任务的日益复杂化,单机器人在很多环境下已经无法满足生产要求,于是国内外科研工作者对多机器人技术投入了大量关注,提出了利用多机器人协作来代替单机…

Karmada更高效地实现故障转移

随着云原生技术的发展,其应用场景不断扩大。越来越多的企业开始将应用程序部署在 Kubernetes 集群中,随着 Kubernetes 集群规模的不断扩大,也带来了许多管理挑战,例如多集群间负载均衡、资源调度、故障转移等问题。为了解决这些问…

【Python】上市公司数据进行经典OLS回归实操

一、题目二、数据合并、清洗、描述性统计1、数据获取2、数据合并3、选择董监高薪酬作为解释变量的理论逻辑分析 三、多元回归模型的参数估计、结果展示与分析1、描述性统计分析2、剔除金融类上市公司3、对所有变量进行1%缩尾处理4、0-1标准化,所有解释变量5、绘制热…

网络运维Day16

文章目录 Docker简介什么是容器命名空间: Docker 的优缺点 Docker安装Docker镜像管理什么是镜像镜像管理 Docker容器管理运行容器容器启动、停止、重启拷贝文件进入容器容器与应用 DockerfileDockerfile 语法案例 总结 Docker简介 什么是容器 容器是用来装东西的&a…

磁带标签设计:Tape Label Studio 2023.11.0.7 Crack

Tape Label Studio(磁带标签设计) 为标签创建颜色样式。修改标签中使用的每种颜色,包括背景、条形码、边框、文本和字符颜色。自定义边框样式以适合您正在使用的标签。从实心、虚线或虚线边框中进行选择。轻松调整宽度和宽度。Tape Label St…

【网络奇缘】- 计算机网络|网络类型|性能指标

🌈个人主页: Aileen_0v0🔥系列专栏: 一见倾心,再见倾城 --- 计算机网络~💫个人格言:"没有罗马,那就自己创造罗马~" 目录 计算机网络分类 1.根据范围分类 ​编辑 2.按使用者分​编辑 3.按交换技术分 ​编辑4.按拓扑结构分 ​…

react中间件的理解

一、是什么? 中间件(Middleware)在计算机中,是介于应用系统和系统软件之间的一类软件,它使用系统软件所提供的基础服务(功能),衔接网络应用上的各个部分或不同的应用,能…

Netty Review - 从BIO到NIO的进化推演

文章目录 BIODEMO 1DEMO 2小结论单线程BIO的缺陷BIO如何处理并发多线程BIO服务器的弊端 NIONIO要解决的问题模拟NIO方案一: (等待连接时和等待数据时不阻塞)方案二(缓存Socket,轮询数据是否准备好)方案二存…

225.用队列实现栈(LeetCode)

思路 思路:用两个队列实现栈后进先出的特性 ,两个队列为空时,先将数据都导向其中一个队列。 当要模拟出栈时,将前面的元素都导入另一个空队列,再将最后一个元素移出队列 实现 实现: 因为C语言没有库可以…

网络运维Day17

文章目录 什么是数据库MySQL介绍实验环境准备构建MySQL服务连接数据库修改root密码 数据库基础常用的SQL命令分类SQL命令使用规则MySQL基本操作创建库创建表查看表结构 记录管理命令 数据类型数值类型 数据类型日期时间类型时间函数案例枚举类型 约束条件案例修改表结构添加新字…

C++实现ransac

目录 一、ransac算法原理 1.1、算法概念 1.2、图解 二、c实现ransac 2.1、设置随机样本和离群点 2.2、随机抽取样本 2.3、内点计算 2.4、更新参数 2.2、完整代码 一、ransac算法原理 1.1、算法概念 随机抽样一致性 (RANSAC) 是一种迭代方法,用于根据一组包…

【Java 进阶篇】JQuery DOM操作:CRUD操作的前端魔法

在前端开发的舞台上,CRUD(Create, Read, Update, Delete)操作是一种极为重要的技能,它涉及对页面元素的增删改查。而JQuery,这位前端开发的魔法师,为我们提供了便捷而强大的方法,使得CRUD操作变…

IP地址如何实现定位功能?

网络犯罪、保护网络安全的重要手段。近日,一则新闻引起了广大网友的关注:IP也能实现定位功能,这是如何做到的呢?本文将对此进行深入解析。 首先,我们需要了解什么是IP地址定位。IP地址定位是通过IP地址确定网络用户所在…

【Windows 开发环境配置——NVIDIA 篇】CUDA、cuDNN、TensorRT 三件套安装

CUDA 从CUDA Toolkit Archive下载相应版本的离线安装包,这里以11.7为例。 打开安装包,在安装选项选择自定义模式,点击下一步。 在自定义安装选项中,仅选择CUDA组件(其中Nsight相关组件用于代码调试与性能分析&#xff…

Linux--线程概念+线程控制

1.什么是线程 相对于进程而言,进程是承担资源调度的实体,线程在进程内部运行,是操作系统调度的基本单位。 在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列…