(论文翻译)PRUNING FILTER IN FILTER《滤波器中的剪枝滤波器》

公式不清楚的地方请对照英文原文进行查看:原文链接

ABSTRACT

剪枝已成为现代神经网络压缩和加速的一种非常有效的技术。现有的剪枝方法可分为两大类:滤波器剪枝(FP)和权重剪枝(WP)。与WP相比,FP在硬件兼容性方面胜出,但在压缩比方面失败。为了收敛两种方法的强度,我们提出在滤波器中对滤波器进行剪枝。具体来说,我们将滤波器F∈RC×K×K视为K个×K条,即1 × 1个滤波器∈RC,然后通过修剪条纹而不是整个滤波器,我们可以在硬件友好的同时实现比传统FP更细的粒度。我们称我们的方法为SWP (Stripe-Wise Pruning)。SWP的实现是通过引入一个新的可学习的矩阵,称为滤波器骨架,其值反映了每个滤波器的形状。正如一些最近的工作表明,修剪的结构比继承的重要权值更重要,我们认为单个过滤器的结构,即形状,也很重要。通过大量的实验,我们证明了SWP比之前基于fp的方法更有效,并在cifa10和ImageNet数据集上实现了最先进的剪枝率,而精度没有明显下降。有关代码载于[this url].(https://github.com/fxmeng/Pruning-Filter-in-Filter)

1 Introduction简介

深度神经网络(DNN)在许多领域取得了显着进展,包括语音识别[1],计算机视觉[2,3],自然语言处理[4]等。然而,由于DNN中的大量参数,模型部署有时是昂贵的。为了缓解这样的问题,已经提出了许多方法来压缩DNN并减少计算量。这些方法可分为两大类:权重修剪(WP)和滤波器(信道)修剪(FP)。

WP是细粒度修剪方法,其修剪各个权重,例如,其值接近0,在网络[5,6]内,导致稀疏网络而不牺牲预测性能。然而,由于非零权重的位置是不规则和随机的,我们需要额外记录权重位置,并且由于网络内部的随机性,WP修剪的稀疏网络无法像FP那样以结构化的方式呈现,使得WP无法在通用处理器上实现加速。相比之下,基于FP的方法[7,8,9]修剪卷积层内的滤波器或通道,因此修剪后的网络仍然以结构方式组织良好,并且可以在通用处理器中轻松实现加速。标准过滤器修剪流水线如下:1)训练更大的模型直到收敛。2)3)对修剪后的网络进行微调。[10]观察到训练修剪模型随机初始化也可以实现高性能。因此,重要的是网络架构,而不是训练的权重。在本文中,我们认为,不仅是网络的架构,但架构的过滤器本身也很重要。[11,12]也得出类似的论点,即具有较大内核大小的滤波器可能导致更好的性能。然而,计算成本昂贵。因此,对于给定的输入特征图,[11,12]使用具有不同内核大小的过滤器(例如,1 × 1、3 × 3和5 × 5)来执行卷积并连接所有输出特征图。但是每个过滤器的核大小是手动设置的。设计高效的网络结构需要专业的经验和知识。我们想知道,如果我们可以学习的最佳内核大小ofeach过滤器修剪。我们的直觉如图1所示。我们知道深度网络的结构对学习任务很重要。例如,残差网络更容易优化,并且表现出比VGG更好的性能。然而,我们发现网络内部隐藏着另一种结构,我们称之为“过滤器的形状”。来自图1,并非滤波器中的所有条纹都有相同的贡献[13]。一些条带具有非常低的l1范数,这指示可以从网络中移除这样的条带。保持滤波器的功能同时留下最少数量的条纹的形状被称为最佳形状。为了捕获与滤波器权重一起的“滤波器形状”,我们提出了“滤波器骨架(FS)”来学习该“形状”属性并使用FS来指导有效的修剪(即学习最佳形状)(见第3节)。与传统的基于FP的剪枝方法相比,该剪枝方法实现了更细的粒度,因为我们使用条带而不是整个过滤器进行操作。

在这里插入图片描述

图1:左图显示了两种网络结构。右图显示了学习的VGG16中滤波器沿着信道维度的平均l1范数。

类似地,在[14,15,16]中引入的按组修剪也实现了比滤波器/信道修剪更精细的粒度,其移除位于某个层中的所有滤波器之间的相同位置的权重。然而,分组式修剪打破了对过滤器的独立假设。举例来说,每一滤波器中的权重的无效位置可不同。通过使用分组修剪来正则化网络,网络可能会在大的修剪率下失去表示能力(参见第4.2节)。在本文中,我们还提供了一个比较组明智的修剪实验。相比之下,SWP保持每个滤波器彼此独立,这不打破滤波器之间的独立假设。在整个实验中,SWP实现了更高的修剪比相比,过滤器明智的,通道明智的,和组明智的修剪方法。我们总结了我们的主要贡献如下:

  • 我们提出了一种新的修剪范式,称为SWP。SWP实现了比传统过滤器修剪更细的粒度,并且修剪后的网络仍然可以被有效地推断
  • 我们引入过滤器骨架(FS),以有效地学习每个过滤器的形状,并深入分析FS的工作机制。使用FS,我们在CIFAR-10和ImageNet数据集上实现了最先进的剪枝率,而没有明显的准确性下降。

2 Related Work相关工作

权重修剪: 权重修剪(WP)可以追溯到最佳脑损伤和最佳脑外科医生[17,18],其基于损失函数的Hessian来修剪权重。[5]基于l1范数准则修剪网络权重并重新训练网络以恢复性能,并且该技术可以通过修剪、量化和霍夫曼编码被并入深度压缩流水线[6]。[19]通过进行动态连接修剪来降低网络复杂度,其将连接拼接并入整个过程中以避免不正确的修剪,并使其成为持续的网络维护。[20]通过求解凸优化程序来移除每个DNN层处的连接。该程序在每一层寻找一组稀疏的权重,使层的输入和输出与最初训练的模型保持一致。[21]提出了一种频域动态修剪方案,以利用CNN上的空间相关性。在每次迭代中动态地修剪频域系数,并且考虑到不同频带对准确度的不同重要性,有区别地修剪不同频带。[22]将每个条带分成多个组,并修剪每个组中的权重。然而,这些非结构化修剪方法的一个缺点是所得到的权重矩阵是稀疏的,这在没有专用硬件/库的情况下不能导致压缩和加速[23]。

过滤器/通道修剪: 过滤器/通道修剪(FP)在过滤器、通道甚至层的级别上进行修剪。由于原始卷积结构仍然被保留,因此不需要专用硬件/库来实现益处。与权值剪枝[5]类似,[7]也采用了l1范数准则来剪枝不重要的滤波器。代替修剪滤波器,[8]提出通过基于LASSO回归的信道选择和最小二乘重构来修剪信道。[9]优化BN层中的缩放因子γ作为信道选择指示符以决定哪个信道是不重要的并且可以被移除。[24]介绍了ThiNet,正式建立过滤器修剪作为一个优化问题,并揭示了我们需要修剪过滤器的统计信息计算的基础上,从它的下一层,而不是当前层。类似地,[25]优化了最终响应层的重建误差,并为每个通道传播“重要性分数”。[26]首先提出利用AutoML进行模型压缩,其利用强化学习来提供模型压缩策略。[27]提出了一种有效的结构化修剪方法,该方法以端到端的方式联合修剪过滤器以及其他结构。具体来说,作者引入了一个软掩模来缩放这些结构的输出,方法是定义一个具有稀疏正则化的新目标函数,以将基线和网络的输出与该掩模对齐。[28]为深度CNN引入了一个预算正则化修剪框架,自然适合传统的神经网络训练。该框架包括一个可学习的掩蔽层,一个新的预算意识的目标函数,并使用知识蒸馏。[29]提出了一种称为Gate Decorator的全局滤波器修剪算法,该算法通过将其输出乘以通道缩放因子来转换香草CNN模块,即门,并在CIFAR数据集上实现了最先进的结果。[30,10]通过大量的实验结果深入分析了初始化是如何影响剪枝的。

在这里插入图片描述

图2:不同类型修剪的可视化。



表1:测试每个只学习过滤器“形状”的网络的准确性

在这里插入图片描述

分组修剪: [14,15]介绍了分组修剪,它使用组套索正则化来学习神经网络中的结构化稀疏性。使用“im2col”实现方式作为滤波器式和通道式修剪,仍然可以有效地处理组式修剪。[31]进一步探讨了一个完整的范围内的修剪粒度,并评估它如何影响预测精度。[16]通过提出动态正则化方法改进了分组剪枝。然而,逐组修剪移除位于某一层中的所有滤波器之间的相同位置的权重。由于每个滤波器的无效位置可能不同,因此按组修剪可能导致网络丢失有效信息。相比之下,我们的方法保持每个过滤器彼此独立,从而可以导致一个更有效的网络结构。不同类型的修剪在图2中示出。

修剪中的Mask: 使用(软)掩码来表示网络中组件的重要性已经在修剪工作中进行了深入研究[32,33,34,35,27,36,37,9,8]。然而,大多数工作都是从滤波器或通道的角度来设计掩模,很少有工作关注条纹。此外,过滤器骨架(FS)不仅仅是一个掩码,我们认为每个过滤器都有两个属性:重量和形状。FS是学习“形状”属性。从本文的第3.1节中,网络仍然具有良好的性能,仅学习滤波器的“形状”,保持滤波器权重随机初始化。

3 The proposed Method提出的方法

3.1 Filter Skeleton (FS)过滤器骨架(FS)

引入FS是为了学习过滤器的另一个重要属性以及它们的权重:形状,其是与滤波器的条纹相关的矩阵。假设第1个卷积层的权重W1的大小为RN×C×K×K,其中,N是滤波器的数量,C是信道维度,并且K是核大小。则该层中FS的大小为RN×K×K。即,FS中的每个值对应于滤波器中的条带。首先用全一矩阵初始化每层中的FS。在训练过程中,我们将过滤器的权重乘以FS。在数学上,损失由下式表示:
在这里插入图片描述

,其中I表示FS,在这里插入图片描述表示点积。对于I,前向过程是:
在这里插入图片描述
.关于W和I的梯度为:
在这里插入图片描述
其中MH、MW分别表示特征图的高度和宽度。当p MH或q MW时,Xlc,p,q = 0< 1 or p >< 1 or q >(这对应于填充和移位[38,39]过程)。

在这里插入图片描述

图3:使用过滤器骨架(FS)进行训练和推理。

根据(1),在训练期间联合优化滤波器权重和FS。在训练之后,我们将I合并到滤波器权重W(即,W ←W I),并且仅在评估期间使用W。因此,当应用推理时,不会给网络带来额外的成本。整个过程如图3所示。为了进一步显示“形状”属性的重要性,我们进行了一个实验,其中过滤器的权重是固定的,只有FS可以在训练过程中进行优化。结果示于表1中。可以看出,在不更新过滤器权重的情况下,网络仍然可以获得不错的结果。我们还发现,使用过滤器骨架,网络的权重变得更加稳定。图4显示了基线网络和由过滤器骨架(FS)训练的网络的权重分布。可以看出,通过FS训练的权重是稀疏和平滑的,其对输入图像具有低方差,从而导致稳定的输出。因此,网络对输入数据或特征的变化是鲁棒的。

3.2 Stripe-wise pruning with FS带FS的条带修剪

从图1中可以看出,并非所有条带在网络中的贡献都是相等的。为了构建紧凑且高度修剪的网络,过滤器骨架(FS)需要稀疏。即,当FS中的一些值接近0时,可以修剪对应的条带。因此,当使用FS训练网络时,我们对FS施加正则化以使其稀疏:
在这里插入图片描述
,其中α控制正则化的大小,g(I)表示I上的l1范数惩罚,这通常用于许多修剪方法[7,8,9]。具体地,g(I)被写为:
在这里插入图片描述
在这里插入图片描述
图4:这张左图和右图分别显示了基线和FS在第一个卷积层上的权重分布。在该层中,每个过滤器具有9个条带。每个迷你图示出了位于所有滤波器的相同位置的条纹的l1范数。还报告了平均值和标准差。

从(5),FS隐式地学习每个滤波器的最佳形状。在第4.4节中,我们将滤波器的形状可视化,以进一步显示这种现象。为了进行有效的修剪,我们设置了一个阈值δ,FS中对应值小于δ的条带在训练期间将不会更新,并且可以在之后进行修剪。值得注意的是,当对修剪后的网络进行推理时,由于过滤器被破坏,我们不能直接使用过滤器作为一个整体对输入特征图进行卷积。相反,我们需要独立地使用每个条带来执行卷积,并对每个条带产生的特征图求和,如图5所示。在数学上,SWP中的卷积过程被写为:

在这里插入图片描述

其中Xl+1n,h,w是第1 + 1层中的特征图的一个点。根据(7),SWP仅修改传统卷积过程中的计算顺序,因此没有向网络添加额外的操作(触发器)。值得注意的是,由于每个条纹在过滤器中具有其自己的位置。SWP需要记录所有条带的索引。然而,与整个网络参数相比,它的成本很小。假设第1个卷积层的权重W1的大小为RN×C×K×K。对于SWP,我们需要记录N ×K ×K个索引。与记录N ×C ×K ×K指标的个体权重剪枝相比,权重剪枝的指标减少了C倍。此外,我们不需要记录过滤器的索引,如果在这样的过滤器中的所有条纹从网络中删除,SWP退化到传统的过滤器式修剪。为了与传统的基于FP的方法进行公平的比较,我们在计算网络参数的数量时添加了索引的数量。

与传统的基于FP的修剪相比,SWP有两个优点:

  • 假设核的大小为K×K,则SWP比传统的基于FP的剪枝算法获得了K2倍更细的粒度,从而获得了更高的剪枝率。
  • 对于某些数据集,例如,CIFAR-10,网络修剪SWP保持高性能,即使没有一个微调过程。这将SWP与需要多个微调过程的许多其他基于FP的修剪方法分开。原因是FS学习每个滤波器的最佳形状。通过修剪不重要的条纹,过滤器不会丢失很多有用的信息。相比之下,FP剪枝直接删除可能损坏网络学习到的信息的过滤器。
    在这里插入图片描述
图5:SWP中的修剪过程。

4 Experiments实验

本节安排如下:在第4.1节中,我们介绍了论文中的实现细节;在4.2节中,我们比较了SWP和分组剪枝;在第4.3节中,我们展示了SWP在CIFAR-10和ImageNet数据集上实现了最先进的剪枝率,与滤波器、通道或形状剪枝相比;在第4.4节中,我们可视化修剪的过滤器;在第4.5节中,我们进行消融研究以研究超参数如何影响SWP。

4.1 Implementation Details实施细节

数据集和模型: CIFAR-10 [40]和ImageNet [41]是两个流行的数据集,并在我们的实验中采用。CIFAR-10数据集包含10个类的50 K训练图像和10 K测试图像。ImageNet包含128万张训练图像和50 K张测试图像,用于1000个类。在CIFAR-10上,我们在两种流行的网络结构上评估了我们的方法:VGG16 [42]、ResNet56 [43]。在ImageNet数据集上,我们采用ResNet 18。

基线设置:我们的基准设置与[9]一致。对于CIFAR-10,该模型被训练了160个时期,批量大小为64。初始学习率被设置为0.1,并在时期80和120处将其除以10。简单的数据增强(随机裁剪和随机水平翻转)用于训练图像。对于ImageNet,我们遵循官方的PyTorch实现1,该实现训练模型90个epoch,批量大小为256。初始学习率被设置为0.1,并且每30个时期将其除以10。图像大小调整为256 × 256,然后从原始图像中随机裁剪224 × 224区域进行训练。测试是在224 × 224像素的中心裁剪上进行的。

SWP设置:基本超参数设置与基线一致。在(5)中,α被设置为1 e-5,并且阈值δ被设置为0.05。对于CIFAR-10,我们在条带选择后不对网络进行微调。对于ImageNet,我们在修剪后执行一次性微调。

4.2 Group-wise pruning vs stripe-wise pruning分组剪枝与条带剪枝

由于分组剪枝也可以通过骨架实现,因此我们基于骨架执行分组剪枝和SWP。图6显示了结果。我们可以看到,在相同数量的参数或触发器下,SWP与分组剪枝相比实现了更高的性能。我们还发现,在分组修剪中,layer2.7.conv1和layer2.7.conv2将被标识为无效(即,当剪枝率达到76.64%时,该层中的所有权重将被该算法剪枝)。然而,这种现象并没有出现在条带式修剪,即使有87.36%的修剪率,这进一步验证了我们的假设,即分组式修剪打破了独立的假设上的过滤器,很容易失去代表性的能力。相比之下,SWP保持每个过滤器彼此独立,从而可以实现更高的剪枝率。

4.3 Comparing SWP with state-of-art methods SWP与最新方法的比较

我们比较SWP与最近的国家最先进的修剪方法。表2和表3分别列出了CIFAR-10和ImageNet上的比较。在表2中,IR [16]是按组修剪方法,除SWP之外的其他方法是按滤波器或按通道方法。我们可以看到GBN [29]甚至优于形状修剪方法。根据我们的分析,分组剪枝将网络的权重规则化在所有过滤器的相同位置,这可能会导致网络丢失有用的信息。因此,分组修剪可能不是最佳选择。然而,SWP优于其他方法的大幅度。例如,当修剪VGG 16时,SWP可以将参数的数量减少92.66%,将触发器的数量减少71.16%,而不会损失网络性能。在ImageNet上,SWP也可以实现比最近的基准测试方法更好的性能。例如,SWP可以将FLOP降低54.58%而没有明显的精度下降。我们想强调的是,即使SWP带来了条带的索引,成本也很小。在计算参数个数时,我们在表2和表3的计算中加入了这些指标。SWP的剪枝率仍然是显着的,并达到最先进的结果。

在这里插入图片描述

图6:比较SWP与CIFAR-10上的按组修剪。骨架是VGG 16。

表2:在CIFAR-10数据集上比较SWP与最先进的基于FP的方法。ResNet 56的基线准确率为93.1% [29],而VGG 16的基线准确率为93.25% [7]。

在这里插入图片描述

表3:比较SWP与ImageNet数据集上的最新剪枝方法。所有方法都使用ResNet 18作为主干,基线top-1和top-5的准确率分别为69.76%和89.08%。

在这里插入图片描述
在这里插入图片描述

图7:通过SWP修剪的VGG19过滤器的可视化。从上到下,我们根据滤波器的频率在这样的层中显示滤波器。白色表示通过SWP去除过滤器中的相应条带。
表4:该表显示了α和δ如何影响SWP结果。实验在CIFAR-10上进行。网络是ResNet 56。

在这里插入图片描述

4.4 Visualizing the pruned filter可视化修剪的过滤器

我们将VGG19的过滤器可视化,以显示通过SWP修剪后的稀疏网络的外观。VGG19的核大小为R3×3,因此每个过滤器中有9个条带。每个过滤器有29种形式,因为每个条带都可以删除或保留。我们根据每种形式的频率显示每层的过滤器。图7显示了可视化结果。有一些有趣的现象:

  • 对于每个层,大多数过滤器直接用所有条带修剪。
  • 在中间层中,大多数保留的过滤器仅具有一个条带。然而,在靠近输入的层中,大多数保留的层具有多个条带。表明冗余大多发生在中间层。

我们相信这种可视化可以更好地理解CNN。在过去,我们总是把滤波器作为CNN中的最小单元。然而,从我们的实验中,过滤器本身的架构也很重要,可以通过修剪来学习。更多的可视化结果可以在补充材料中找到。

4.5 Ablation Study消融研究

在本节中,我们将研究不同的超参数如何影响剪枝结果。我们主要研究了(1)中的加权系数α和剪枝阈值δ。表4示出了实验结果。我们发现α = 1e − 5和δ = 0.05给出了可接受的剪枝率和测试精度。

5 Conclusion结论

在本文中,我们提出了一个新的修剪范式称为SWP。代替修剪整个滤波器,SWP将每个滤波器视为多个条带的组合(即,1 × 1过滤器),并对条带执行修剪。我们还引入了过滤器骨架(FS),以有效地学习过滤器的最佳形状进行修剪。通过大量的实验和分析,我们证明了SWP框架的有效性。未来的工作可以开发更有效的正则化器来进一步优化DNN。

6 Supplementary Material补充材料

在这里插入图片描述

图8:在CIFAR-10上比较Filter Skeleton与Lasso正则化器。骨架是VGG 16。

这是论文“过滤器中的修剪过滤器”的补充材料。第6.1节显示,我们可以使用SWP来继续修剪由其他基于FP(过滤器修剪)的方法修剪的网络。第6.2节显示,在SWP框架中,Filter Skeleton比lasso正则化更好。第6.3节显示了更多的可视化结果。

6.1 Continual Pruning in SWP SWP中的连续剪枝

由于SWP可以达到比传统过滤器修剪方法更细的粒度,我们可以使用SWP继续修剪网络修剪由其他方法修剪没有明显的准确性下降。表5示出了实验结果。可以观察到,SWP可以帮助其他基于FP的修剪朝向更高的修剪比率。

表5:该表显示了CIFAR-10数据集上的变体修剪方法。A+B表示先用方法A修剪网络,然后用方法B继续修剪网络。

在这里插入图片描述

6.2 Filter Skeleton v.s. Group Lasso过滤器骨架与集团套索

在本文中,我们使用过滤器骨架(FS)来学习每个过滤器的最佳形状,并修剪不重要的条纹。然而,存在其他技术来正则化网络以使其稀疏。例如,基于Lasso的正则化器[15],它直接正则化网络权重。我们在本节中提供了与Group Lasso正则化器的比较。图8显示了结果。我们可以看到,在相同的参数或触发器数量下,具有过滤器骨架的PFF实现了更高的性能。

6.3 More Visualization Results更多可视化结果

在本节中,我们将展示SWP修剪后的网络。图9显示了ResNet 56在CIFAR-10上的可视化结果。可以观察到,(1)SWP在中间层上具有较高的修剪比率,例如,层2.3至层2.9。(2)每一条带的修剪率是不同的,并且在每一层上变化。表6显示了ImageNet上的修剪网络。例如,在layer1.1.conv2中,原始的64个过滤器的大小为R62×3×3。修剪后的条纹大小为R62×1×1,共300条。该层中的剪枝比为1 − 300×62×1×1 64×62×3×3 = 0.47。
在这里插入图片描述
在这里插入图片描述

图9:在图中,我们展示了每层的剩余条带的比率。每个滤波器具有从s1到s9索引的9个条带。
表6:该表显示了ImageNet上修剪的ResNet18的结构。

在这里插入图片描述

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

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

相关文章

springboot开发PC端桌面应用

一、需求描述&#xff1a; 1、要求桌面能在window、Linux和macos系统上运行 2、用户自定义数据筛选策略&#xff0c;策略可通过excel导入导出 3、选择多个excel文件通过策略过滤生成新的excel 二、技术选型及集成环境配置&#xff1a; 1、PC端跨平台直接选用javafx来作为桌…

SpringBoot + Vue前后端分离项目实战 || 四:用户管理功能实现

系列文章&#xff1a; SpringBoot Vue前后端分离项目实战 || 一&#xff1a;Vue前端设计 SpringBoot Vue前后端分离项目实战 || 二&#xff1a;Spring Boot后端与数据库连接 SpringBoot Vue前后端分离项目实战 || 三&#xff1a;Spring Boot后端与Vue前端连接 SpringBoot V…

从零开始制作一个Web蜜罐扫描器(5)

从零开始制作一个Web蜜罐扫描器(3)_luozhonghua2000的博客-CSDN博客 打开一个蜜罐: 查看源码: 这个./js/portraitjs非常引人注入,点进去看一下 很明显是被混淆过了,结合语义来理解,这是portrait=画像,那么可以大胆猜测这段ison是黑客画像用的.猜测了就要进行验证,这里在…

Kafka request.log中RequestQueueTimeMs、LocalTimeMs、RemoteTimeMs、ThrottleTimeMs、含义

Kafka request.log中RequestQueueTimeMs、LocalTimeMs、RemoteTimeMs、ThrottleTimeMs、含义 要理解各个延时项的含义&#xff0c;必须从Kafka收到TCP请求、处理请求到返回TCP包整个流程开始梳理 RequestQueueTimeMs Processor 执行processNewResponses() 方法&#xff0c;不…

软件工程师,学习下JavaScript ES6新特性吧

概述 作为一名软件工程师&#xff0c;不管你是不是前端开发的岗位&#xff0c;工作中或多或少都会用到一点JavaScript。JavaScript是大家所了解的语言名称&#xff0c;但是这个语言名称是Oracle公司注册的商标。JavaScript的正式名称是ECMAScript。1996年11月&#xff0c;JavaS…

RT-Thread 互补滤波器 (STM32 + 6 轴 IMU)

作者&#xff1a;wuhanstudio 原文链接&#xff1a;https://zhuanlan.zhihu.com/p/611568999 最近在看无人驾驶的 Prediction 部分&#xff0c;可以利用 EKF (Extended Kalman Filter) 融合不同传感器的数据&#xff0c;例如 IMU, Lidar 和 GNSS&#xff0c;从而给出更加准确的…

Go语言github.com/gorilla/websocket框架websocket协议通信实战

websocket是实际开发中比较常用的应用层协议&#xff0c;本文利用github.com/gorilla/websocket框架进行websocket通信实战。 目录 1.下载github.com/gorilla/websocket 2.websocket服务端 3.websocket Go客户端 4.websocket 网页客户端 5.运行结果展示 1.下载github.com…

Red Hat Subscription 开发者订阅与激活订阅

目录 前言 进入开发者页面 创建红帽账户 阅读Red Hat订阅&#xff1b; 激活订阅 查看订阅状态 前言 使用命令时会出现以提示&#xff0c;命令不可正常使用。 根据提示信息&#xff0c;我们可以知道&#xff0c;需要通过Red Hat Subscription&#xff0c;开发者订阅。 …

图像分类——图像增强方法

目录 常用的图像增强方法tf.image进行图像增强翻转和裁剪颜色变换 使用ImageDataGenerator(进行图像增强) 常用的图像增强方法 tf.image进行图像增强 离线实现 import tensorflow as tf import matplotlib.pyplot as plt import numpy as npcatplt.imread(./cat.jpg) plt.ims…

Scala中的集合

水善利万物而不争&#xff0c;处众人之所恶&#xff0c;故几于道&#x1f4a6; 目录 一、集合简介 二、集合关系继承图 一、集合简介 Java中的集合&#xff1a; Scala中的集合&#xff1a; Scala的集合有三大类&#xff1a;序列Seq、集Set、映射Map&#xff0c;所有的集合…

单片机基于stm32单片机的数字温度计设计_kaic

摘 要 古往今来,陶瓷在我们的生活中一直都是不可或缺的物品,而随着当今社会经济的快速发展,人们对于这些高档陶瓷产品的使用性能和产品质量上的要求也愈加严格。那么在陶瓷品的生产过程中,想要提高陶瓷品的品质和合格率,能够随时监测温度的温度计是必不可少的。 本课题的研究是…

MySQL单表查询练习题

目录 第一题 第二题 第三题 第一题 1.创建数据表pet&#xff0c;并对表进行插入、更新与删除操作&#xff0c;pet表结构如表8.3所示。 (1&#xff09;首先创建数据表pet&#xff0c;使用不同的方法将表8.4中的记录插入到pet表中。 mysql> create table pet( name varchar(…

IDEA+SpringBoot+mybatis+SSM+layui+Mysql客户管理系统源码

IDEASpringBootmybatisSSMlayuiMysql客户管理系统 一、系统介绍1.环境配置 二、系统展示1. 管理员登录2.修改密码3.客户管理4.添加客户5.充值记录管理6.消费记录管理7.客户类型8.添加客户类型 三、部分代码UserMapper.javaLoginController.javaUser.java 四、其他获取源码 一、…

【MQ】Windows上RabbitMQ的安装与启动

文章目录 下载Erlang安装RabbitMQ 下载Erlang RabbitMQ基于Erlang语言&#xff0c;因此使用RabbitMQ之前需要先安装Erlang&#xff0c;如下 Erlang语言下载 这里我是用的是25.2.2这个版本&#xff0c;我的机器是64bit的&#xff0c;所以下win64的即可。 下载完毕安装包之后点…

List移除元素的四种方式

List 移除某个元素 四种方式&#xff1a; 方式一&#xff0c;使用 Iterator &#xff0c;顺序向下&#xff0c;如果找到元素&#xff0c;则使用 remove 方法进行移除。方式二&#xff0c;倒序遍历 List &#xff0c;如果找到元素&#xff0c;则使用 remove 方法进行移除。方式…

在Windows server 2012上使用virtualBox运行CentOS7虚拟机,被强制暂停

文章目录 问题场景排查过程处理解决事后反思 问题场景 我们的平台服务使用docker部署&#xff0c;使用docker-compose进行管理&#xff0c;部署到CentOS7的服务器里平台部署到客户环境时&#xff0c;一小部分客户&#xff0c;使用自己机房或单独的服务器。很多客户不愿意采购新…

【MySQL】SQL索引失效的几种场景及优化

MySQL中提高性能的一个最有效的方式是对数据表设计合理的索引。索引提供了高效访问数据的方法&#xff0c;并且加快查询的速度&#xff0c; 因此索引对查询的速度有着至关重要的影响。 使用索引可以快速地定位表中的某条记录&#xff0c;从而提高数据库查询的速度&#xff0c;…

【东南亚情报局】Lazada饰品商家如何做到8倍的增长率

用小小的商品挖呀挖呀挖&#xff0c;在东南亚的市场&#xff0c;种出大大的花~如何抓住东南亚消费者的心巴&#xff0c;踩中时尚节拍&#xff0c;本篇文章《东南亚情报局》一起看看饰品趋势都有哪些特征&#xff01; 【1.指南篇】 Y2K:Y2K风格在亚洲迅速火爆起来&#xff0c;…

微信小程序精选,多样化的功能与便捷体验

白噪音Pro、魔术字体和天天倒计时&#xff0c;这三款微信小程序正越来越受到我们的欢迎。它们各自具有独特的功能和特点&#xff0c;为我们提供了多样化的体验。现在&#xff0c;让我们一起来详细介绍一下这三款小程序。 首先是白噪音Pro。随着生活节奏的加快和压力的增加&…

【图像处理】Python判断一张图像是否亮度过低

比如&#xff1a; 直方图&#xff1a; 代码&#xff1a; 这段代码是一个用于判断图像亮度是否过暗的函数is_dark&#xff0c;并对输入的图像进行可视化直方图展示。 首先&#xff0c;通过import语句导入了cv2和matplotlib.pyplot模块&#xff0c;用于图像处理和可视化。 i…