MetaFormer实际上是你所需要的视觉

news2024/11/23 19:50:00

在这里插入图片描述
transformer在计算机视觉任务中显示出了巨大的潜力。人们普遍认为,他们基于注意力的token混合器模块对他们的能力贡献最大。然而,最近的工作表明,transformer中基于注意力的模块可以被空间mlp取代,得到的模型仍然表现相当好。基于这一观察,本文假设transformer的通用架构,而不是特定的token mixer模块,对模型的性能更重要。为验证这一点,故意用一个简单得令人尴尬的空间池化操作符取代transformer中的注意力模块,以只进行基本的token混合。提出的模型称为PoolFormer,在多个计算机视觉任务上实现了有竞争力的性能。例如,在ImageNet-1K上,PoolFormer实现了82.1%的top-1精度,比经过良好调整的视觉Transformer/类mlp基线DeiT-B/ResMLP-B24提高了0.3%/1.1%的精度,参数减少了35%/52%,mac减少了50%/62%。PoolFormer的有效性验证了我们的假设,并敦促我们发起" MetaFormer "的概念,一种从transformer抽象出来的通用架构,而不指定token混合器。MetaFormer是在最近的Transformer和类mlp模型在视觉任务上取得优越结果的关键角色。这项工作呼吁未来进行更多致力于改进MetaFormer的研究,而不是专注于token mixer模块。所提出的PoolFormer可以作为未来MetaFormer架构设计的起始基线。

1. 介绍

transformer在计算机视觉领域获得了极大的兴趣和成功[3,8,44,55]。自从视觉Transformer (ViT)[17]将纯Transformer适应于图像分类任务的开创性工作以来,人们开发了许多后续模型,以进一步改进并在各种计算机视觉任务中取得了有希望的性能[36,53,63]。
在这里插入图片描述

Transformer编码器如图1(a)所示,由两部分组成。一个是注意力模块,用于在token之间混合信息,我们将其称为token mixer。另一个组件包含剩余的模块,如通道mlp和残差连接。通过将注意力模块视为特定的token mixer,进一步将整体Transformer抽象为未指定token mixer的通用架构MetaFormer,如图1(a)所示。

transformer的成功长期以来归功于基于注意力的token混合器[56]。基于这一共识,已经开发了许多注意力模块[13,22,57,68]的变体,以改进视觉Transformer。然而,最近的一项工作[51]将注意力模块完全替换为空间mlp作为token mixers,并发现派生的类mlp模型可以很容易地在图像分类基准上获得有竞争力的性能。后续工作[26,35,52]通过数据高效的训练和特定的MLP模块设计进一步改进类MLP模型,逐渐缩小与ViT的性能差距,并挑战注意力作为token mixers的主导地位。

最近的一些方法[32,39,40,45]在MetaFormer架构中探索了其他类型的token mixers,并展示了令人鼓舞的性能。例如,[32]用傅里叶变换取代了注意力,仍然达到了普通transformer的约97%的精度。综合所有这些结果,似乎只要模型采用MetaFormer作为通用架构,就可以获得有希望的结果。因此,本文假设与特定的token mixers相比,MetaFormer对模型实现有竞争力的性能更重要。

为了验证这一假设,我们应用一个极其简单的非参数操作符pooling作为令牌混合器,只进行基本的令牌混合。令人惊讶的是,这个被称为PoolFormer的派生模型实现了具有竞争力的性能,甚至始终优于经过良好调优的Transformer和类mlp模型,包括DeiT[53]和ResMLP[52],如图1(b)所示。更具体地说,PoolFormer-M36在ImageNet-1K分类基准上达到82.1%的top-1精度,超过调优的视觉变压器/ mlp样基准DeiTB/ResMLP-B24 0.3%/1.1%的精度,参数减少35%/52%,mac减少50%/62%。这些结果表明,即使使用简单的令牌混合器,MetaFormer仍然可以提供有希望的性能。因此,我们认为MetaFormer是我们对视觉模型的实际需求,它对实现有竞争力的性能更重要,而不是特定的令牌混合器。注意,这并不意味着令牌混合器不重要。MetaFormer仍然有这个抽象组件。这意味着令牌混合器不局限于特定类型,例如注意力。

我们的论文有两方面的贡献。将Transformer抽象为一个通用架构的MetaFormer,并通过经验证明Transformer/ mlp类模型的成功在很大程度上归功于MetaFormer架构。通过仅采用简单的非参数算子pooling作为MetaFormer的极弱token混合器,构建了一个名为PoolFormer的简单模型,发现它仍然可以实现具有高度竞争力的性能。希望本文的发现能启发更多致力于改进MetaFormer的未来研究,而不是专注于token mixer模块。在多个视觉任务上评估了所提出的池化器,包括图像分类[14]、目标检测[34]、实例分割[34]和语义分割[67],与使用token mixer的复杂设计的SOTA模型相比,取得了有竞争力的性能。PoolFormer可以很容易地作为未来MetaFormer架构设计的良好起始基线。

2. 相关工作

transformer首先由[56]提出用于翻译任务,然后迅速在各种NLP任务中流行起来。在语言预训练任务中,transformer在大规模无标签文本语料库上进行训练,并取得了惊人的性能[2,15]。受transformer在NLP中成功的启发,许多研究人员将注意力机制和transformer应用于视觉任务[3,8,44,55]。值得注意的是,Chen等人引入了iGPT[6],其中Transformer被训练为自回归预测图像上的像素以进行自监督学习。Dosovitskiy等人提出了以硬贴片嵌入作为输入[17]的视觉Transformer (ViT)。他们表明,在监督图像分类任务上,在一个大型分集(3亿张图像的JFT数据集)上预训练的ViT可以取得优异的性能。DeiT[53]和T2T-ViT[63]进一步证明,仅在ImageNet-1K(~ 130万张图像)上从头进行预训练的ViT可以取得很好的性能。许多工作一直致力于通过移位的windows[36]改进transformer的token混合方法,相对位置编码[61],细化注意力图[68],或合并卷积[12,21,60]等。除了类似注意力的token mixers之外,[51,52]令人惊讶地发现,仅仅采用mlp作为token mixers仍然可以实现有竞争力的性能。这一发现挑战了基于注意力的token mixer的主导地位,并在研究界引发了关于哪种token mixer更好的热烈讨论[7,26]。然而,这项工作的目标既不是参与这场辩论,也不是设计新的复杂的token mixers来实现新的技术水平。相反,我们要研究一个基本问题:是什么真正促成了变形金刚及其变种的成功?我们的答案是通用架构,即MetaFormer。我们只是利用池化作为基本的token mixers来探测MetaFormer的能力。

与此同时,一些作品也在回答同样的问题。Dong等人证明,在没有残差连接或mlp的情况下,输出双指数收敛到秩为1的矩阵[16]。Raghu et al.[43]比较了ViT和cnn之间的特征差异,发现自注意力允许早期收集全局信息,而残差连接将特征从较低的层传播到较高的层。Park et al.[42]表明,多头自注意力通过扁平化损失景观来提高准确性和泛化性。遗憾的是,他们没有将transformer抽象为通用架构,并从通用框架的角度进行研究。

3.方法

3.1. MetaFormer

提出了MetaFormer的核心概念。如图1所示,从transformer[56]抽象而来,MetaFormer是一种通用架构,其中没有指定令牌混合器,而其他组件与transformer保持相同。输入I首先通过输入嵌入处理,例如vit[17]的patch embedding,
X = Input ⁡ Emb ⁡ ( I ) , (1) X=\operatorname{Input} \operatorname{Emb}(I), \tag{1} X=InputEmb(I),(1)

其中 X ∈ R N × C X \in \mathbb{R}^{N \times C} XRN×C表示序列长度为N、嵌入维度为C的嵌入词例。

然后,将嵌入标记馈送到重复的元former块,每个元former块包含两个残差子块。具体来说,第一个子块主要包含一个token mixer,用于token之间的信息通信,该子块可以表示为

Y =  TokenMixer  ( Norm ⁡ ( X ) ) + X , (2) Y=\text { TokenMixer }(\operatorname{Norm}(X))+X, \tag{2} Y= TokenMixer (Norm(X))+X,(2)

其中Norm(·)表示层规范化[1]或批规范化[28]等规范化;TokenMixer(·)是一个主要用于混合token信息的模块。它是通过最近的视觉Transformer模型[17,63,68]中的各种注意力机制或类MLP模型中的空间MLP实现的[51,52]。请注意,令牌混合器的主要功能是传播令牌信息,尽管一些令牌混合器也可以混合通道,如attention。

第二个子块主要由一个非线性激活的两层MLP组成,
Z = σ ( Norm ⁡ ( Y ) W 1 ) W 2 + Y (2) Z=\sigma\left(\operatorname{Norm}(Y) W_{1}\right) W_{2}+Y \tag{2} Z=σ(Norm(Y)W1)W2+Y(2)

其中 W 1 ∈ R C × r C W_{1} \in \mathbb{R}^{C \times r C} W1RC×rC W 2 ∈ R r C × C W_{2} \in \mathbb{R}^{r C \times C} W2RrC×C为MLP膨胀比r的可学习参数; σ ( ⋅ ) \sigma(\cdot) σ()是一个非线性激活函数,如GELU[25]或ReLU[41]。

MetaFormer的实例化。 MetaFormer描述了一种通用架构,通过指定token mixer的具体设计,可以立即获得不同的模型。如图1(a)所示,如果将token mixer指定为attention或spatial MLP,则MetaFormer将分别成为Transformer或类似MLP的模型

3.2. PoolFormer

从transformer[56]的介绍开始,大量工作都非常重视和关注设计各种基于注意力的token mixer组件。相比之下,这些工作很少关注通用架构,即MetaFormer。

本文认为,这种MetaFormer通用架构在很大程度上有助于最近的Transformer和mlp模型的成功。为了演示这一点,我们故意使用一个非常简单的操作符pooling作为token mixer。该操作符没有可学习的参数,它只是使每个标记平均地聚合其附近的标记特征。
由于这项工作是针对视觉任务的,假设输入是通道优先的数据格式,即 T ∈ R C × H × W T \in \mathbb{R}^{C \times H \times W} TRC×H×W

T : , i , j ′ = 1 K × K ∑ p , q = 1 K T : , i + p − K + 1 2 , i + q − K + 1 2 − T : , i , j T_{:, i, j}^{\prime}=\frac{1}{K \times K} \sum_{p, q=1}^{K} T_{:, i+p-\frac{K+1}{2}, i+q-\frac{K+1}{2}}-T_{:, i, j} T:,i,j=K×K1p,q=1KT:,i+p2K+1,i+q2K+1T:,i,j

其中K是池化大小。由于MetaFormer块已经具有残差连接,因此在公式(4)中添加对输入本身的减法。池化的类似pytorch的代码如算法1所示。
在这里插入图片描述

众所周知,自注意力和空间MLP的计算复杂度是要混合的token数量的二次。更糟糕的是,空间mlp在处理较长的序列时带来了更多的参数。因此,自注意力和空间mlp通常只能处理数百个标记。相比之下,池化需要与序列长度线性的计算复杂度,而无需任何可学习的参数。因此,我们通过采用类似于传统cnn[24,31,49]和最近的分层Transformer变体[36,57]的分层结构来利用池化。图2显示了PoolFormer的整体框架。具体来说,PoolFormer有4个阶段,分别为 H 4 × W 4 \frac{H}{4} \times \frac{W}{4} 4H×4W H 8 × W 8 \frac{H}{8} \times \frac{W}{8} 8H×8W H 16 × W 16 \frac{H}{16} \times \frac{W}{16} 16H×16W H 32 × W 32 \frac{H}{32} \times \frac{W}{32} 32H×32W token,其中H和W表示输入图像的宽度和高度。有两组嵌入大小:1)小型模型,嵌入维度分别为64、128、320和512;2)嵌入尺寸为96、192、384和768的中型模型。假设总共有L个PoolFormer块,阶段1、2、3和4将分别包含L/6、L/6、L/2和L/6个PoolFormer块。设置MLP膨胀率为4。根据上述简单的模型缩放规则,我们得到了5种不同模型大小的PoolFormer,其超参数如表1所示。
在这里插入图片描述

4. 实验

4.1. 图像分类

设置。 ImageNet-1K[14]是计算机视觉中使用最广泛的数据集之一。它包含大约130万张训练图像和50K张验证图像,涵盖了常见的1K类。我们的培训方案主要遵循[53]和[54]。具体来说,MixUp [65], CutMix [64], CutOut[66]和RandAugment[11]用于数据增强。使用AdamW优化器[29,37]对模型进行300 epoch的训练,权重衰减0.05,峰值学习率lr = 1e−3·batch size/1024(本文使用批量大小4096和学习率4e−3)。预热epoch的数量为5,使用余弦计划来衰减学习率。标签平滑[50]设置为0.1。Dropout被禁用,但使用随机深度[27]和LayerScale[54]来帮助训练深度模型。我们修改了层归一化[1],以计算沿着token和通道维度的均值和方差,而不是仅在普通层归一化中的通道维度。通过指定组编号为1,可以使用PyTorch中的GroupNorm API实现通道优先数据格式的修改层规范化(MLN)。如4.4节所示,PoolFormer首选MLN。有关超参数的更多细节,请参阅附录。实验基于Timm代码库[58]实现,并在tpu上进行。
在这里插入图片描述
在这里插入图片描述

结果。 表2显示了poolformer在ImageNet分类上的性能。定性结果见附录。令人惊讶的是,尽管使用了简单的池化令牌混合器,但与cnn和其他类metaformer模型相比,poolformer仍然可以实现极具竞争力的性能。例如,PoolFormer-S24在只需要21M参数和3.4G mac的情况下,达到了80以上的top-1精度。相比之下,建立良好的ViT基线DeiT-S[53]的精度略差,为79.8,需要更多35%的mac (4.6G)。为了获得类似的精度,类mlp模型ResMLP-S24[52]需要多43%的参数(30M)和76%的计算量(6.0G),而精度仅为79.4。即使与更改进的ViT和MLPlike变体相比[35,57],PoolFormer仍然表现出更好的性能。具体来说,金字塔变压器PVTMedium在44M参数和6.7G MACs下获得81.2的top-1精度,而PoolFormer-S36在比PVT-Medium少30%的参数(31M)和25%的MACs (5.0G)下达到81.4。

此外,与RSB-ResNet (" ResNet Strikes Back ")[59]相比,PoolFormer仍然表现更好,其中ResNet[24]使用改进的训练程序训练相同的300 epoch。通过约22M个参数/3.7G mac, RSB-ResNet-34[59]获得了75.5的精度,而PoolFormerS24可以获得80.3的精度。由于池化层的局部空间建模能力远不如神经卷积层,因此池化器的竞争性能只能归功于其通用架构元former。

使用池化操作符,每个标记均匀地聚合其附近标记的特征。因此,这是一个极其基本的token混合操作。然而,实验结果表明,即使使用这个非常简单的token mixer, MetaFormer仍然可以获得非常有竞争力的性能。图3清楚地显示,PoolFormer比其他模型具有更少的mac和参数。这一发现表明,通用架构MetaFormer实际上是我们在设计视觉模型时需要的。通过采用MetaFormer,可以保证导出的模型具有达到合理性能的潜力。

4.2. 目标检测与实例分割

设置。在具有挑战性的COCO基准[34]上评估了PoolFormer,其中包括118K训练图像(train2017)和5K验证图像(val2017)。在训练集上对模型进行训练,并在验证集上进行性能测试。PoolFormer被用作两个标准检测器的主干,即RetinaNet[33]和Mask R-CNN[23]。利用ImageNet预训练权重来初始化主干,Xavier[20]来初始化添加的层。采用AdamW[29,37]进行训练,初始学习率为1×10−4,批量大小为16。接下来[23,33],我们采用1×训练时间表,即训练12个周期的检测模型。训练图像被调整为短边800像素,长边不超过1333像素。为了测试,图像较短的一侧也被调整为800像素。基于mmdetection[4]代码库,在8张NVIDIA A100 gpu上进行了实验。
在这里插入图片描述

结果。如表3所示,基于poolformer的模型配备了用于对象检测的RetinaNet,其性能始终优于类似的ResNet模型。例如,PoolFormer-S12达到了36.2 AP,大大超过了ResNet-18的31.8 AP。基于maskR-CNN的模型在目标检测和实例分割上也有相似的结果。例如,PoolFormer-S12在很大程度上超过了ResNet-18(边界框AP 37.3比34.0,mask AP 34.6比31.2)。总的来说,在COCO对象检测和实例分割方面,PoolForemrs取得了具有竞争力的性能,始终优于ResNet。

4.3. 语义分割

设置。选择具有挑战性的场景解析基准ADE20K[67]来评估语义分割模型。该数据集在训练集和验证集中分别包含20K和2K图像,涵盖150个细粒度语义类别。poolformer被评估为配备语义FPN[30]的骨干。ImageNet-1K训练的检查点用于初始化主干,而Xavier[20]用于初始化其他新添加的层。常用实践[5,30]训练模型80K次迭代,批大小为16。为了加快训练速度,我们将批大小增加一倍至32,并将迭代次数减少至40K。采用AdamW[29,37],初始学习率为2 × 10−4,将在多项式衰减计划中以0.9的幂衰减。将图像调整大小并裁剪为512 × 512用于训练,将图像调整为512像素的较短一侧用于测试。我们的实现基于mmsegmentation[10]代码库,实验在8个NVIDIA A100 gpu上进行。
在这里插入图片描述

结果。表4显示了使用FPN[30]对不同骨干网的ADE20K语义分割性能。基于poolformer的模型的性能始终优于以基于cnn的ResNet[24]和ResNeXt[62]为骨干的模型以及基于transformer的pvm。例如,PoolFormer-12的mIoU分别比ResNet-18和pvm - tiny更好,达到37.1,分别高了4.3和1.5。

这些结果表明,作为主干的PoorFormer在语义分割上可以获得具有竞争力的性能,尽管它只是利用池来实现token之间的基本信息通信。这进一步表明了MetaFormer的巨大潜力,并支持了我们的断言,即MetaFormer正是我们所需要的。

4.4. 消融研究

消融实验在ImageNet-1K[14]数据集上进行。表5报告了PoolFormer的消融研究。我们将从以下几个方面讨论消融。
在这里插入图片描述

令牌混合器。与transformer相比,PoolFormer所做的主要改变是使用简单池化作为令牌混合器。首先通过直接将池化替换为身份映射来对该算子进行消融。令人惊讶的是,具有身份映射的MetaFormer仍然可以达到74.3%的top-1精度,这支持了MetaFormer实际上是我们需要保证合理性能的说法。

然后将每个块的池化替换为全局随机矩阵 W R ∈ R N × N W_{R} \in \mathbb{R}^{\mathbb{N} \times \mathbb{N}} WRRN×N。矩阵用区间[0,1)上均匀分布的随机值初始化,然后利用Softmax对每行进行归一化。经过随机初始化后,矩阵参数被冻结,并通过 X ′ = W R X X^{\prime}=W_{R} X X=WRX进行token混合,其中 X ∈ R N × C X \in \mathbb{R}^{\mathbb{N} \times \mathbb{C}} XRN×C是输入token特征,token长度为N,通道维度为c。由于第一阶段token长度非常大,随机矩阵的token混合器为S12模型引入了额外的21M冻结参数。即使采用这种随机token混合方法,该模型仍然可以达到75.8%的准确率,比身份映射提高1.5%。它表明,即使在随机token混合的情况下,MetaFormer仍然可以很好地工作,更不用说与其他精心设计的token混合器一起工作。

此外,池化被深度卷积[9,38]取代,该卷积具有用于空间建模的可学习参数。不足为奇的是,派生模型仍然取得了极具竞争力的性能,top-1精度为78.1%,比PoolFormer-S12高出0.9%,因为它具有更好的局部空间建模能力。到目前为止,我们在Metaformer中指定了多个token mixers,所有产生的模型都保持着很好的结果,很好地支持了Metaformer是保证模型竞争力的关键的说法。由于池化的简单性,它主要用作演示MetaFormer的工具。

测试了池化大小对PoolFormer的影响。当池化大小为3、5和7时,我们观察到类似的性能。然而,当池化大小增加到9时,性能明显下降0.5%。因此,我们为PoolFormer采用默认的池化大小3。

归一化。将层归一化[1]修改为修改的层归一化(MLN),与仅计算普通层归一化中的通道维度相比,沿token和通道维度计算均值和方差。MLN的可学习仿射参数的形状与层归一化保持一致,即RC。通过将组号设置为1,可以在PyTorch中使用GroupNorm API实现MLN。详情参见附录。PoolFormer更倾向于MLN,比层规范化或批规范化高0.7%或0.8%。因此,MLN被设置为PoolFormer的默认值。去除归一化后,模型不能很好地训练收敛,性能急剧下降到仅46.1%。

激活函数。我们将GELU[25]改为ReLU[41]或SiLU[18]。当采用ReLU激活时,性能明显下降0.8%。对于四路而言,其性能几乎与格路相同。因此,我们仍然使用GELU作为默认激活。

其他组件。除了上述讨论的token混合器和归一化之外,残差连接[24]和通道MLP[46,47]是MetaFormer中的另外两个重要组件。如果没有残差连接或通道MLP,模型无法收敛,只能达到0.1%/5.7%的精度,证明了这些部分的不可缺少性。

混合阶段。在基于池化、注意力和空间MLP的token mixers中,基于池化的token mixers可以处理更长的输入序列,而注意力和空间MLP擅长捕捉全局信息。因此,考虑到序列已大大缩短,在底部阶段堆叠具有池化的元转换器来处理长序列,并在顶部阶段使用注意力或基于空间mlp的混合器是很直观的。因此,在PoolFormer的前一或两个阶段,将token混合器池化替换为注意力或空间FC1。从表5可以看出,混合模型表现相当好。在底部两个阶段使用池化,在顶部两个阶段使用注意力的变体提供了具有高度竞争力的性能。在仅16.5M参数和2.5G mac的情况下,达到了81.0%的准确率。作为对比,ResMLP-B24需要7.0× parameters (116M)和9.2× MACs (23.0G)才能达到相同的精度。这些结果表明,将MetaFormer的池化与其他token mixers相结合,可能是进一步提高性能的一个有希望的方向。

5. 结论及未来工作展望

本文将Transformer中的注意力抽象为token mixer,将整个Transformer抽象为称为MetaFormer的通用架构,其中没有指定token mixer。本文指出,MetaFormer实际上是我们需要保证实现合理性能的东西,而不是专注于特定的token mixers。为了验证这一点,我们故意将token mixer指定为MetaFormer的极其简单的池化。发现导出的PoolFormer模型可以在不同的视觉任务上取得有竞争力的性能,很好地支持了" MetaFormer实际上是你视觉所需的"这一观点。

未来,我们将在更多不同的学习环境下进一步评估PoolFormer,如自监督学习和迁移学习。此外,有趣的是,看看PoolFormer是否仍然适用于NLP任务,以进一步支持“MetaFormer实际上是你在NLP领域所需要的”的说法。希望这项工作可以启发更多致力于改进基本架构MetaFormer的未来研究,而不是过度关注token mixer模块。

缩写解释

MACs(Multiply–Accumulate Operations):乘加累积操作数,常常被人们与FLOPs概念混淆实际上1MACs包含一个乘法操作与一个加法操作,大约包含2FLOPs。通常MACs与FLOPs存在一个2倍的关系。

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

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

相关文章

11.关联容器

文章目录关联容器11.1使用关联容器使用map使用set11.2关联容器概述11.2.1定义关联容器初始化multimap或multiset11.2.2关键字类型的要求有序容器的关键字类型使用关键字类型的比较函数11.2.3pair类型创建pair对象的函数11.3关联容器操作11.3.1关联容器迭代器set的迭代器是const…

为什么Docker比VM虚拟机快?

(1)docker有着比虚拟机更少的抽象层 由于docker不需要Hypervisor(虚拟机)实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上docker将会在效率上有明显优势。 (2)docker利用的是宿主机的内核,而不需要加载操…

基于springboot招生管理系统设计与实现的源码+文档

摘 要 在Internet高速发展的今天,我们生活的各个领域都涉及到计算机的应用,其中包括招生管理系统的网络应用,在外国招生管理系统已经是很普遍的方式,不过国内的管理网站可能还处于起步阶段。招生管理系统具有招生公告信息管理功能…

实训任务一

文章目录实训任务一一、实训任务1、创建并且配置三个虚拟机2、创建SSH连接3、实现IP地址与主机名的映射4、关闭和禁用防火墙5、创建目录结构6、压缩打包7、安装软件包8、创建脚本文件9、直接运行脚本10、虚拟机相互免密登录11、远程拷贝文件实训任务一 需求:熟练掌…

java+MySQL 基于ssm高校创新实践学分认定系统

随着现代实践学分认定的快速发展,可以说实践学分认定已经逐渐成为现代实践学分认定过程中最为重要的部分之一。但是一直以来我国传统的实践学分认定并没有建立一套完善的行之有效的实践学分认定系统,传统的实践学分认定已经无法适应高速发展,无论是从效率还是从效果来看都远远的…

问题解决之:chatGPT 登录页面的 google 验证 reCAPTCHA 弹不出来

文章目录问题描述自己的境况分析结论问题描述 今天我到了图书馆想访问一下 chatgpt,挂了 vpn 之后所有的浏览器都无法弹出 reCAPTCHA 人机验证,即使我更换了不同的 vpn 和为 chrome 的 reCAPTCHA 设置了重定向也无法成功 正常情况:应该弹…

基于B\S的《C语言程序设计》学习网站的设计与实现

开发工具(eclipse/idea/vscode等): 数据库(sqlite/mysql/sqlserver等): 功能模块(请用文字描述,至少200字): 1)系统平面设计:设计精美、简洁且清爽的系统界面。 2)课程信息管理:对课程的基本信息、课程目标…

Mybatis源码分析(二)Mybatis-config.xml的初始化

目录一 环境搭建二 配置文件初始化2.1 ClassLoader2.2 获取配置文件官网:mybatis – MyBatis 3 | 简介 参考书籍:《通用源码阅读指导书:MyBatis源码详解》 易哥 参考文章: 一看你就懂,超详细java中的ClassLoader详解A…

【Unity3DRPG入门学习笔记第三卷】PolyBrush 构建场景

一、安装 Polybrush 导入样例 我新建了一个新文件夹 Plugins 用来管理 打开 Polybrush Window 二、使用 Polybrush 1. 选中物体,使用第一个工具,会发现可以显示顶点,可以改变网格,例如我们可以上下拖拽地面改变地形 正常左键点…

Java 包装类

Java包装类\huge{Java \space 包装类}Java 包装类 概述 所谓的包装类,通俗来讲其实就是888种基本数据类型对应的引用类型(本质就是引用类型)。 ❗❗❗尤其注意charcharchar对应的包装类的名称是charactercharactercharacter,in…

大数据学习:shell基础

文章目录一、常用shell命令任务一:查看/etc目录信息前5行信息任务二:查看/etc/profile文件后5行信息二、grep命令选项参数任务一:抓取/etc目录下的python信息任务二:抓取/etc/profile文件里的dev信息任务三:抓取用户数…

Revit运行很卡?这些招数你学会(废)了吗?

在日常的项目实施过程中,我们经常会感觉到Revit运行越来越慢。当然,和我们经常吐槽的软件本身有一定的关系,除此之外,根据我这些年的经验总结,规避掉以下问题可大幅度缓解Revit卡顿的问题。 01禁用结构分析选项 我们…

一条道简单的算法引发的思考

前言 新一季的 Rick&Morty 已经上线,剧集质量虽然有所下降,但 E03 中的 SheepCounter 挺有意思。自己照着剧中的设定开发了一款界面极其相似、交互更为丰富的小程序,小程序的终极目标只有一个:数羊!数羊&#xff…

大数据Kudu(六):Kudu Java Api操作

文章目录 ​​​​​​Kudu Java Api操作 一、​​​​​​​​​​​​​​添加Maven依赖

zos-open gb28181,rtsp,rtmp,hls直播储存回放,上下级级联

fslib框架 fslib框架是一套可运行于生产环境的支持c/c线程死锁,线程cpu资源统计,死机时自动记录死机所对应的源码位置的调试框架,部分功能支持php语言;fslib框架内置了很多实用库配置库(FsConfig)--支持向上向下兼容的配置模块,同时可以导出与导入json和…

Ajax(三)

1.form表单的基本使用 1.1 什么是表单 表单在网页中主要负责数据采集功能。HTML中的<form>标签&#xff0c;就是用于采集用户输入的信息&#xff0c;并通过<form>标签的提交操作&#xff0c;把采集到的信息提交到服务器端进行处理。 1.2 表单的组成部分 表单标签…

java+MySQL 基于ssm的网上定点餐外卖系统

网上订餐不是一蹴而就的事情,它需要的是线上线下的共同努力。对于线上来说,安全、稳定、功能完善的网站构建必不可少,这是主要的也是最重要的一部分,网站是“脸面”,好的脸面会吸引更多的顾客光顾。而对于线下来说,好的菜品是一个订餐网站的支柱,我们不能仅靠各色各样的图片满足…

mockito的详细使用

目录 1.概述 2.使用 2.1.依赖 2.2.校验 2.2.1.值校验 2.2.2.顺序校验 2.2.3.指定返回 2.3.注解 2.3.1.Mock 2.3.2.Spy 2.3.3.Captor 2.3.4.InjectMocks 1.概述 mock&#xff0c;一种JAVA单元测试技术&#xff0c;mock允许使用模拟对象替换测试中的系统部件&#xf…

【Redis】Redis 分布式锁

文章目录概述Redis 实现分布式锁加锁释放锁死锁概述 在单体项目中&#xff0c;我们处理多线程同时操作某一处代码块或者变量时就使用 Synchronized 或者 Lock 锁去保证数据的安全性&#xff0c;但是&#xff0c;现在我们基本上都是使用微服务&#xff0c;当我们把服务部署到多…

一文说透小程序插件及其作用价值

最近工作接触小程序插件比较多&#xff0c;就想着不如跟大家系统分享一下小程序插件相关的内容。 首先&#xff0c;我们要先弄清楚小程序插件究竟是什么&#xff1f; 简单来说&#xff0c;小程序插件就是可被添加到小程序内直接使用的功能组件。插件依附于主程序的辅助程序&a…