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

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

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

相关文章

cmd打开idea

当我们用idea打开一个项目的时候,有时候这个项目目录是有的,但是用idea的open却找不到,有时候我要重新关闭窗口,再open好多次才有 于是我现在使用命令打开,先把idea安装路径的bin目录放在path里面 然后cd到项目路径&…

Linux操作系统使用及C高级编程-D3Linux shell命令(权限、输入输出)

Shell 是一种应用程序,用以完成用户与内核之间的交互 一个功能强大的编程语言(C语言) 一个解释执行的脚本语言,不需要编译,写完直接执行 目前Linux 乌班图的Shell默认是bash 查看当前提供的Shell:cat /…

Tomcat隐藏版本号和关闭默认管理页面

一. 隐藏Tomcat异常页面中的版本信息,Tomcat服务器版本号泄露 Tomcat/8.5.xx相关版本号等信息,是不安全的。这会被黑客获取到,利用该版本的其他漏洞对服务器进行异常操作,所以需要隐藏掉。 进入tomcat安装目录 apache-tomcat-8.…

如何修改文件的修改时间?

如何修改文件的修改时间?随着当代社会科技的不断进步,我们对信息和数据的依赖程度与日俱增。在这个信息化时代,文件处理已经成为数字化办公中不可或缺的一部分。文件处理的范围非常广,其中有一个比较冷门的操作技巧,那…

《QT从基础到进阶·二十三》弹窗提示框QMessageBox和QCloseEvent事件

1、正常信息提示 QMessageBox::information(NULL, "Title", "Content", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);消息框按钮判断: if(QMessageBox::Ok QMessageBox::warning(this,"温馨提示","是否保存设置?…

智慧工地管理云平台源码,Spring Cloud +Vue+UniApp

智慧工地源码 智慧工地云平台源码 智慧建筑源码支持私有化部署,提供SaaS硬件设备运维全套服务。 互联网建筑工地,是将互联网的理念和技术引入建筑工地,从施工现场源头抓起,最大程度的收集人员、安全、环境、材料等关键业务数据&am…

光纤网络排障分析

日常工作中,发现某条光链路连接不稳定,时快时慢、时断时连。 在交换机上直接查看这条链路交换口上的光收发功率,发现异常。 简单说明下,RX Power代表光模块接收功率,TX Power代表发送功率。 引起这种故障的原因很多&a…

Java实现身份证号校验,最后一位校验码校验

中国居民身份证号码编码规则 第一、二位表示省(自治区、直辖市、特别行政区)。 第三、四位表示市(地级市、自治州、盟及国家直辖市所属市辖区和县的汇总码)。其中,01-20,51-70表示省直辖市;21-5…

Elasticsearch 面试题

文章目录 Elasticsearch 读取数据您能解释一下 X-Pack for Elasticsearch 的功能和重要性吗?Elasticsearch 中的节点(比如共 20 个),其中的 10 个选了 一个master,另外 10 个选了另一个 master,怎么办&…

嵌入式杂记 -- MCU的大小端模式

MCU的大小端模式 大端模式小端模式大小端模式测试联合体概念MCU大小端模式测试大端模式测试小端模式测试 大小端模式转换 在进行MCU开发的时候,我们需要注意MCU的数据存储模式,在嵌入式中有两种不同的存储模式,分别是 大端模式和小端模式。 …

Linux 函数库

函数库: 我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实“printf”函数的呢? 最后的答案是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中去…

数据结构 | 带头双向循环链表专题

数据结构 | 带头双向循环链表专题 前言 前面我们学了单链表,我们这次来看一个专题带头的双向循环链表~~ 文章目录 数据结构 | 带头双向循环链表专题前言带头双向循环链表的结构实现双向链表头文件的定义哨兵位初始化创建节点尾插尾删头插头删打印查找指定位置前插入…

揭秘视频号创作者分成计划,带你玩赚视频号流量主,保姆级教程

项目介绍 今天给大家分享一个视频号流量主的一个项目,也就是视频号创作者广告分成计划。这个项目在目前来说是一个蓝海赛道,做的人是比较少,作为副业来说还是非常适合个人来做的。如果大家有工作室的话,也可以进行批量操作&#…

在mac上使用jmap -heap命令报错:Attaching to process ID 96530, please wait...

在mac上执行命令jmap -heap 96530 报错: Attaching to process ID 96530, please wait... ERROR: attach: task_for_pid(96530) failed: (os/kern) failure (5) Error attaching to process: sun.jvm.hotspot.debugger.DebuggerException: Cant attach to the proc…

nginx安装搭建

下载 免费开源版的官方网站:nginx news Nginx 有 Windows 版本和 Linux 版本,但更推荐在 Linux 下使用 Nginx; 下载nginx-1.14.2.tar.gz的源代码文件:wget http://nginx.org/download/nginx-1.14.2.tar.gz 我的习惯&#xff0…

【Go入门】面向对象

【Go入门】面向对象 前面两章我们介绍了函数和struct,那你是否想过函数当作struct的字段一样来处理呢?今天我们就讲解一下函数的另一种形态,带有接收者的函数,我们称为method method 现在假设有这么一个场景,你定义…

蓝桥杯之模拟与枚举day1

发现更多的计算机知识&#xff0c;欢迎访问xiaocr的个人网站 Question1卡片(C/CA组第一题) 这个是一道简单的模拟枚举题目&#xff0c;只要把对应每次的i的各个位都提取出来&#xff0c;然后对应的卡片数目减去1即可。属于打卡题目。注意for循环的特殊使用即可 #include <…

【毕业论文】基于微信小程序的植物分类实践教学系统的设计与实现

基于微信小程序的植物分类实践教学系统的设计与实现https://download.csdn.net/download/No_Name_Cao_Ni_Mei/88519758 基于微信小程序的植物分类实践教学系统的设计与实现 Design and Implementation of Plant Classification Practical Teaching System based on WeChat Mini…

【10套模拟】【4】

关键字&#xff1a; 二分查找比较次数、*广义表头尾链表存储、森林转二叉树、链地址法哈希表、交换所有子树、创建二叉排序树

Mysql Explain工具介绍

使用EXPLAIN关键字可以模拟优化器执行SQL语句&#xff0c;分析查询语句或是结构的性能瓶颈。 准备表 -- 课程表 CREATE TABLE class (id int(11) NOT NULL,name varchar(45) DEFAULT NULL,update_time datetime DEFAULT NULL,PRIMARY KEY (id)) ENGINEInnoDB DEFAULT CHARSET…