论文解读:(VPT)Visual Prompt Tuning

文章汇总

要解决的问题

大型模型应用于下游任务本身就存在挑战。最明显的(通常也是最有效的)适应策略是对预先训练好的模型进行全面的端到端微调。

动机

只微调参数的一个子集

解决的办法

只在输入空间中引入少量特定于任务的可学习参数,而在下游训练期间冻结整个预训练的Transformer主干。

方法简述

作者的方法十分简单

VPT-Shallow

这里X_i,E_i分别为第i层的CLS和图像的特征向量

提示符仅插入到第一个Transformer层L_1。之后让这些提示符自学习。

每个提示符号是一个可学习的d维向量。p个提示的集合记为
P=\{p^k \in R^d|k \in N,1\le k\le p\},浅提示ViT为:

颜色红色和蓝色分别表示可学习和冻结的参数。

VPT-Deep(效果更好一些)

每个Transformer层的输入空间中引入提示符。值得注意的是,每一层插入的提示词是不一样的,这样没有信息的互动,也会存在训练不足、不稳定的风险(https://arxiv.org/abs/2304.08386 该论文对此进行了改进)。

对于第(i+1)层L_{i+1},我们将输入可学习提示的集合记为P_i=\{p_i^k \in R^d|k\in N,1\le k \le m\}。深层提示的ViT公式为:

摘要

目前适应预训练模型的操作方法涉及更新所有骨干参数,即全面微调。本文介绍了视觉提示调谐(Visual Prompt Tuning, VPT)作为一种有效的替代方案,在视觉上对大型变压器模型进行全微调。从高效调优大型语言模型的最新进展中获得灵感,VPT在保持模型主干冻结的同时,仅在输入空间中引入少量(不到模型参数的1%)可训练参数。通过对各种下游识别任务的广泛实验,我们表明,与其他参数高效调优协议相比,VPT实现了显着的性能提升。最重要的是,在跨模型容量和训练数据规模的许多情况下,VPT甚至优于完全微调,同时降低了每个任务的存储成本。代码可从https://github.com/kmnp/vpt获得。

介绍

对于各种识别应用,现在最准确的结果是通过适应在大量精选或原始数据上预训练的大型基础模型获得的,这一发现反映了自然语言处理(NLP)的发展[6]乍一看,这是一个成功的故事:人们可以通过利用最新和最伟大的基础模型在多个识别问题上取得快速进展。然而,在实践中,将这些大型模型应用于下游任务本身就存在挑战。最明显的(通常也是最有效的)适应策略是对预先训练好的模型进行全面的端到端微调。但是,该策略要求为每个任务存储和部署骨干参数的单独副本。这是一个昂贵且通常不可行的提议,特别是对于现代基于Transformer的架构,它比卷积神经网络(ConvNet)的对对物要大得多,例如,ViT-Huge [19] (632M参数)与ResNet-50 [31] (25M参数)。因此,我们要问,在有效性和效率方面,什么是使大型预训练变压器适应下游任务的最佳方法?

图1所示。视觉提示调整(VPT)与其他迁移学习方法。(a)目前的迁移学习协议是根据调整范围分组的:完全微调,面向头部和面向骨干的方法。(b) VPT在输入空间中增加了额外的参数。(c)采用预训练的ViT-B主干在广泛的下游分类任务上的不同方法的表现,并附有平均值和标准差注释。在使用不到1%的所有模型参数的情况下,VPT在24种情况中有20种优于Full微调。

一种直接的方法是转向我们已经完善的其他策略,使卷积神经网络适应新的任务,如图1(a)所示。一种流行的方法是只微调参数的一个子集,如分类器头[56,36,11]或偏差项[8]。先前的研究也着眼于向主干添加额外的残余块(或适配器)[68,87]。我们可以在《变形金刚》中实施类似的策略。然而,总的来说,这些策略在准确性上表现不佳。

我们在本文中探索了一条不同的路径。我们不修改或微调预训练的Transformer本身,而是修改Transformer的输入。从NLP中提示的最新进展中获得灵感[50,48,45,51],我们提出了一种新的简单有效的方法来调整变压器模型以适应下游视觉任务(图1(b)),即视觉提示调谐(VPT)。我们的方法只在输入空间中引入少量特定于任务的可学习参数,而在下游训练期间冻结整个预训练的Transformer主干。在实践中,这些附加参数被简单地添加到每个Transformer层的输入序列中,并在微调期间与线性头部一起学习。

在使用预训练的ViT主干跨越不同领域的24个下游识别任务中,VPT击败了所有其他迁移学习基线,甚至在20个案例中超过了完全微调,同时保持了为每个单独任务存储更少参数(不到主干参数的1%)的优势(图1(c))。这一结果证明了视觉提示的独特强度:而在NLP中,提示调谐仅在某些情况下才能匹配完全微调性能[45]。VPT在低数据状态下特别有效,并在整个数据规模上保持其优势。最后,VPT在一系列变压器规模和设计(ViTBase/Large/Huge, Swin)方面具有竞争力。综上所述,我们的结果表明VPT是适应不断增长的视觉骨干的最有效方法之一。

2.相关工作

Transformer

transformer模型[73]在自然语言处理中取得了巨大成功[17,66,7]。Transformer架构的成功也扩展到各种计算机视觉任务,包括图像分类[19,52]、目标检测[9,49]、语义和全视分割[71,89,78]、视频理解[25,79,21]和少镜头学习[18],超越了以前最先进的方法。在最近的自监督预训练方法中,变压器也被广泛使用[11,30,3]。与卷积神经网络相比,变形金刚具有更优越的性能和更大的规模,如何有效地适应不同的视觉任务仍然是一个重要的开放性问题。我们提议的VPT提供了一条有希望的前进道路。

迁移学习

在卷积神经网络的背景下,迁移学习已经被广泛研究用于视觉任务[92],并引入了许多技术,包括侧调谐[87],残差适配器[67],偏置调谐[8]等。相对而言,很少有人关注视觉transformer的适应性,而上述方法在这种全新类型的架构上的表现如何仍然未知。另一方面,考虑到大规模预训练的基于transformer的语言模型(LM)的主导地位[17,66,7],已经提出了许多方法[29,28,35]来有效地微调LM以适应不同的下游NLP任务[77,76]。其中,我们在实验中主要关注以下两种具有代表性的方法进行基准测试:Adapters[64]和BitFit[5]。适配器[34]在每个Transformer层中插入额外的轻量级模块。一个适配器模块一般由一个线性向下投影、一个非线性激活函数、一个线性向上投影和一个残差连接组成[63,64]。[8]提出在微调ConvNets时更新偏置项并冻结其余骨干参数,而不是插入新的模块。BitFit[3]将该技术应用于transformer,并验证了其在LM调谐上的有效性。我们的研究表明,相对于NLP中前面提到的两种成熟的方法,VPT在适应视觉任务的Transformer模型方面提供了更好的性能。

提示学习

提示[50]最初指的是在输入文本前添加语言指令,使预训练的LM能够“理解”任务。在手动选择提示的情况下,GPT-3对下游迁移学习任务具有很强的泛化能力,即使在少量或零次设置下也是如此[7]。除了后续关于如何构建更好的提示文本的工作[70,37]之外,最近的工作提出将提示视为特定于任务的连续向量,并在微调期间通过梯度直接优化它们,即提示调整[48,45,51]。与完全微调相比,它实现了相当的性能,但参数存储减少了1000倍。虽然提示最近也被应用到视觉语言模型中[65,91,39,84,22],但提示仍然局限于文本编码器的输入。由于视觉和语言模式之间的差异,在本文中我们提出:同样的方法是否可以成功地应用于图像编码器?我们是第一个解决这个问题的工作(参见相关的并行工作[69,80,14,2]),并通过跨越多个领域和主干架构的多种识别任务的广泛实验来研究视觉提示的通用性和可行性。

3.方法

我们提出了视觉提示调谐(VPT)来适应大型预训练的视觉变压器模型。VPT在Transformer的输入空间中注入少量可学习的参数,并在下游训练阶段保持主干冻结。总体框架如图2所示。我们首先在3.1节中定义符号,然后在3.2节中正式描述VPT。

图2所示。我们提议的视觉提示调优概述。我们探索了两种变体:(a)向每个Transformer编码器层的输入(VPT-deep)添加一组可学习的参数;(b)只将提示参数插入到第一层的输入(VPTshallow)。在下游任务的训练过程中,只有提示符和线性磁头的参数被更新,而整个变压器编码器被冻结。

3.1知识准备

对于N层的plain Vision Transformer (ViT)[19],将输入图像划分为m个固定大小的patch
\{I_j\in R^{3\times h\times w}|j\in N,1\le j\le m\}h,w是图像patch的高度和宽度。然后,每个patch首先通过位置编码嵌入到d维潜在空间中:

我们表示图像patch嵌入的集合E_i=\{e^j_i\in R^d|j\in N,1\le j\le m\},作为第(i+1)Transformer层(L_{i+1})的输入。加上一个额外的可学习分类令牌([CLS]),整个ViT被表述为:

式中x_i \in R^d表示[CLS]在L_{i+1}输入空间的嵌入。[·,·]表示在序列长度维度上进行叠加和拼接,即
[x_i,E_i]。每一层L_i由多头自注意(MSA)和前馈网络(FFN)以及LayerNorm[1]和残差连接组成。神经分类头用于将最后一层的[CLS]嵌入x_N映射到预测的类概率分布y中。

3.2视觉提示调优(VPT)

给定一个预训练的Transformer模型,我们在嵌入层之后的输入空间中引入一组p维d的连续嵌入,即提示符。在微调期间,只有特定于任务的提示被更新,而Transformer主干被冻结。根据所涉及的Transformer层的数量,我们的方法有两种变体,VPT-shallow和VPT-deep,如图2所示。

图2所示。我们提议的视觉提示调优概述。我们探索了两种变体:(a)向每个Transformer编码器层的输入(VPT-deep)添加一组可学习的参数;(b)只将提示参数插入到第一层的输入(VPTshallow)。在下游任务的训练过程中,只有提示符和线性磁头的参数被更新,而整个变压器编码器被冻结。

VPT-Shallow

提示符仅插入到第一个Transformer层L_1中。每个提示符号是一个可学习的d维向量。p个提示的集合记为P=\{p^k \in R^d|k \in N,1\le k\le p\},浅提示ViT为:

其中,Z_i\in R^{p\times d}表示第i层Transformer计算出的特征,[x_i,Z_i,E_i]\in R^{(1+p+m)\times d}。颜色红色和蓝色分别表示可学习和冻结的参数。值得注意的是,对于ViT,x_N对于提示符的位置是不相关的,因为它们是在位置编码之后插入的,例如,[x_0,P,E_0],[x_0,E_0,P]在数学上是等价的。这也适用于VPT-Deep。

VPT-Deep.

在每个Transformer层的输入空间中引入提示符。对于第(i+1)层L_{i+1},我们将输入可学习提示的集合记为P_i=\{p_i^k \in R^d|k\in N,1\le k \le m\}。深层提示的ViT公式为:

存储视觉提示

VPT在存在多个下游任务时是有益的。我们只需要为每个任务存储学习到的提示和分类头,并重用预训练的Transformer模型的原始副本,从而显著降低了存储成本。例如,给定一个参数为8600万(M)且d = 768的ViT-Base, 50个浅层提示和50个深层提示分别产生
p\times d = 50\times 768 = 0.038M,N\times p\times d = 0.46M的额外参数,分别仅占所有VIT - Base参数的0.04%和0.53%。

4实验

我们评估VPT的下游识别任务与预训练的变压器骨干跨尺度。我们首先在4.1节中描述了我们的实验设置,包括预训练的骨干和下游任务,并简要介绍了其他迁移学习方法。然后,我们在第4.2节中演示了我们的方法的有效性和实用性。我们还系统地研究了不同的设计选择将如何影响性能(第4.3节),从而更好地理解我们的方法。

4.1实验设置

预训练backbone

我们在视觉上实验了两种Transformer架构,vision Transformer (ViT)[19]和Swin Transformer (Swin[52])。本节中的所有主干都是在ImageNet-21k上进行预训练的[16]。我们遵循原始配置,例如分割图像补丁的数量,是否存在[CLS]等。更多细节见附录A。

Baselines

我们将VPT的两种变体与其他常用的微调协议进行了比较:

(a) Full:完全更新所有骨干和分类头参数。

(b)以分类头为重点的方法。他们将预训练的主干作为特征提取器,其权重在调优过程中是固定的:

-线性:只使用线性层作为分类头。

-part -k:微调主干的最后k层,同时冻结其他k层,如[85,88,60,30]所采用。它重新定义了脊柱和分类头的边界。

-MLP-k:使用k层多层感知器(MLP)作为分类头,而不是线性层。

(c)在微调期间更新骨干参数子集或向骨干添加新的可训练参数的方法:

-siddetune[87]:训练一个“侧”网络,并在输入到头部之前在预训练的特征和侧调谐的特征之间进行线性插值。

-Bias[8,5]:只微调预训练主干的Bias项。

-适配器[34,63,64]:插入新的MLP模块与变压器层内部的剩余连接。

下游任务

我们在以下两个数据集上进行实验:

FGVC由5个基准细粒度视觉分类任务组成,包括Cub -200-2011[75]、NABirds[72]、Oxford Flowers[59]、Stanford Dogs[41]和Stanford Cars[23]。如果某个数据集只有公开可用的训练集和测试集,我们将训练集随机分为train(90%)和val(10%),并依赖val来选择超参数。

VTAB-1k[86]是19种不同视觉分类任务的集合,分为三组:自然-包含使用标准相机捕获的自然图像的任务;专业化——包含通过专业设备(如医疗和卫星图像)捕获的图像的任务;结构化——需要几何理解的任务,比如物体计数。VTAB的每个任务包含1000个训练样例。接下来[86],我们使用提供的800-200分割的训练集来确定超参数,并使用完整的训练数据运行最终的评估。我们在三次运行中报告测试集的平均准确度分数。

我们报告了FGVC数据集的平均精度,以及VTAB中三组数据集的平均精度。每个任务的单独结果都在附录D中,以及上述任务的图像示例。

4.2主要结果

表1。VIT-B/16在监督ImageNet-21k上预训练。对于每种方法和每个下游任务组,我们报告了与Full相比(·)的平均测试准确性分数和获胜次数。“Total params”表示所有24个下游任务所需的总参数。“Scope”表示每种方法的调优范围。“额外参数”表示除了预训练的主干和线性头部外,还存在额外参数。除Full方法外,所有方法的结果均为最佳。VPT在24个案例中的20个案例中表现出色,可训练参数明显减少。

表1给出了在4个不同的下游任务组中平均微调预训练的VPT - b /16的结果,并将VPT与其他7个调优协议进行了比较。我们可以看到:

1. 在4个问题类别中的3个(24个任务中的20个)上,VPT-Deep的表现优于Full(表1(a)),同时使用的总模型参数显著减少(1.18× vs. 24.02×)。因此,即使存储不是一个问题,VPT也是一种很有前途的方法,可以在视觉上适应更大的变压器。请注意,这一结果与NLP的可比研究相反,NLP的即时调整匹配,但不超过完全微调[45]。

2. 在所有任务组中,VPT-Deep的性能优于所有其他参数高效调优协议(表1(b,c)),这表明VPT-Deep是存储受限环境中最佳的微调策略。

3. 虽然不如VPT-deep最优,但与表1(b)中的面向头部的调优方法相比,VPT-shallow仍然提供了显著的性能增益,这表明如果存储约束很严重,在部署多任务微调模型时,VPT-shallow是一个值得选择的方法。

不同下游数据大小的VPT

图3所示。在不同下游数据规模上的性能比较,平均跨越5个FGVC任务。VPT-deep与Linear(左)、Adapter(中)和Bias(右)进行了比较。高亮区域显示了VPT-deep与对比方法的精度差异。所有样地均给出了VPT-shallow结果,便于参考。标记的大小与对数尺度中可调参数的百分比成正比。

我们研究了FGVC任务中训练数据大小对准确性的影响(VTAB只有1k个训练样本)。我们将训练数据在10%到80%之间变化,并比较所有方法。同样的预训练ViT-B用于下游训练。每种方法在不同训练数据尺度上的任务平均结果如图3所示。

图3显示,跨数据尺度,VPT-deep优于所有其他基线。深入挖掘,使用较少可训练参数的方法,即VPT, Linear, Adapter, Bias,在低数据区域中占主导地位。然而,当线性和适配器有更多的训练数据可用时,这种趋势就会逆转。相比之下,VPT-deep在训练数据大小上仍然始终优于full。尽管Bias提供了类似的优势,但它仍然略微低于全面的VPT-deep(图3右)。

4.3模型设计变换的消融

我们在有监督的ImageNet-21k预训练的ViT-Base上删除不同的模型设计选择,并在VTAB上进行评估,设置与表1相同。详见附录B。

提示位置

VPT和其他方法之间的一个重要区别是作为Transformer层的输入引入了额外的可学习参数。图5显示了在输入空间中如何以及在何处插入提示的不同选择,以及它们将如何影响最终性能。

图5所示。消融在提示位置。我们在顶部说明了不同的位置选择,并在底部展示了结果。为了便于比较,两条蓝色虚线分别表示默认VPT-deep和VPT-shallow的性能。

Prepend还是Add?与第3.2节中描述的在图像补丁嵌入序列Ei中添加提示不同,另一种选择是直接在这些嵌入中添加提示元素,保持Transformer的输入序列长度与之前相同。虽然这种变体在某些情况下(例如,VTAB-Natural)可以与Full竞争,但在深度和浅度设置中,它的性能通常落后于默认的Prepend。关于这一现象的更多讨论见附录B。

潜在空间还是像素空间?与其将提示作为潜在向量插入到第一个Transformer层,不如在Eq.(1)中嵌入层之前的像素级别引入提示,即前置像素和连接通道。图5显示了这两种变量的自适应性能下降。例如,在投影层(prependar -pixel)之前添加浅提示的准确率分数,与VTAB-Natural上嵌入空间(Prepend)的默认添加相比,下降了6.9%。如果我们将一个新的通道连接到输入图像(Concat-channel),则性能会进一步恶化(甚至在VTAB-Natural上高达30个精度分数下降)。这些观察结果表明,提示符更容易在transformer的潜在输入空间中学习浓缩的任务相关信号。

提示符的长度

与完全调优相比,这是为VPT调优所需的唯一额外超参数。为了便于参考,我们还删除了另外两个附加超参数的基线,即Mlp的层数和Adapter的减少率。如图6所示,不同任务的最佳提示长度不同。值得注意的是,即使只有一个提示,VPT-deep仍然明显优于其他两个基线,并且与VTABStructured和Natural的完全微调相比仍然具有竞争力甚至更好。

图6所示。消融提示长度。我们改变VPT-deep的提示数量,并显示每个VTAB子组的平均结果。为方便参考,还显示了每个任务的平均最佳VPT-deep结果。

5分析与讨论

可视化

图9显示了VTAB中3个任务(SVNH [58], EuroSAT [32], Clevr/count[38])的xN的t-SNE[55]可视化,即在最后一个Transformer层之后和分类头之前嵌入[CLS],每个任务一个子群。所有的图都表明,在使用比Full更少的参数的情况下,VPT-deep支持线性可分表示。我们还观察到,与仅为第一层的输入插入提示的VPT-shallow相比,每个Transformer层(VPT-deep)的额外可调参数提高了性能。有趣的是,在Clevr/count(图9(c))上,与VPT-shallow和Linear不同,VPT-deep和Full恢复了任务的底层流形结构(对图像中的物体进行计数,而不是街道号码或景观识别)。

图9所示。来自测试集的3个VTAB任务的最终[CLS]嵌入x_N的t-SNE可视化,见表1。VPT可以在不更新主干参数的情况下产生线性可分特征

6结论

我们提出了视觉提示调谐,一种新的参数有效的方法来利用大视觉变压器模型进行广泛的下游任务。VPT在输入空间中引入特定于任务的可学习提示,使预训练的主干保持固定。我们表明,VPT可以超越其他微调协议(通常包括完全微调),同时显著降低存储成本。我们的实验也提出了关于不同预训练目标的视觉变形器的微调动力学,以及如何有效地转移到更广泛的视觉识别任务的有趣问题。因此,我们希望我们的工作将启发未来关于如何最好地挖掘视觉中大型基础模型潜力的研究。

参考资料

论文下载(2022 ECCV)

https://arxiv.org/abs/2203.12119

代码地址

GitHub - KMnP/vpt: ❄️🔥 Visual Prompt Tuning [ECCV 2022] https://arxiv.org/abs/2203.12119

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

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

相关文章

Attention和Transformer灵魂七问

1. 引言 最近,ChatGPT和其他聊天机器人将大语言模型LLMs推到了风口浪尖。这就导致了很多不是学ML和NLP领域的人关注并学习attention和Transformer模型。在本文中,我们将针对Transformer模型结构提出几个问题,并深入探讨其背后的技术理论。这…

出海企业必备:Zoho Desk打造高效海外工单管理体系!

出海工单系统和常见的工单系统相比有什么不同呢?工单系统主要事帮助售前或者售后人员记录、处理、跟踪客户需求,不仅有利于企业内部管理的规范化,还能够有效提高客户服务质量。 工单系统可以帮助出海企业搭建统一的订单管理、售后服务、甚至…

Java多线程交替打印

多线程交互 在Java中,可以使用synchronized关键字或者java.util.concurrent包中的工具来实现多线程交替打印。以下是一个使用synchronized关键字的示例: public class AlternatePrinting {private static final Object lock new Object();private sta…

AES和RSA加解密算法学习笔记(实战版)

1. 写在前面 今天整理一篇有关密码学的学习笔记,原因是最近做的一个任务是在网络传输的时候,需要对传输的包进行加密和解密工作,以保证传输过程的安全性。所以,这个过程用到了AES和RSA两个算法。 场景:假设我要给我的老师传送毕设代码和论文, 我已经把代码和论文打成了一…

Giants Planet 宣布推出符文,建立在坚实价值的基础上

这是一项旨在释放我们不断发展的生态系统全部潜力的新功能。符文提供了一种更简单的方法来创建通证,这些通证可以从比特币区块链的安全性和去中心化中获益。 符文:建立在坚实的基础上 可以将比特币视为存储贵重物品的安全保险库。 符文就像保险库中的特…

Idea:阿里巴巴Java编码插件

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 一、Alibaba Java Coding Guidelines插件介绍 二、使用步骤 总结 提示:以下是本篇文章正文内容,下面案例可供参考 一、Alibaba Java Coding …

微软如何打造数字零售力航母系列科普02 --- 微软低代码应用平台加速企业创新 - 解放企业数字零售力

微软低代码应用平台推动企业创新- 解放企业数字零售力 微软在2023年GARTNER发布的魔力象限图中处于头部领先(leader)地位。 其LCAP产品是Microsoft Power Apps,扩展了AI Builder、Dataverse、Power Automate和Power Pages,这些都包…

计算机网络实验——学习记录五(TCP协议2)

一、TCP协议重传机制 TCP协议是一种面向连接、可靠的传输层协议。为了保证数据的可靠传输,TCP采用数据包重传的机制来应对网络传输过程中可能出现的丢包、错包和乱序等问题。 TCP协议的重传包括超时重传、快速重传、带选择确认SACK的重传和重复SACK重传四种。 二、…

基于JavaWeb手工艺品购物系统的设计与实现

1、系统演示视频(演示视频) 2、需要请联系

实现游戏地图读取与射击运行

射击代码来源自2D 横向对抗射击游戏(by STF) - CodeBus 地图读取改装自 瓦片地图编辑器 解决边界检测,实现使用不同像素窗口也能移动不闪退-CSDN博客 // 程序:2D RPG 地图编辑器改游戏读取器 // 作者:民用级脑的研发…

HarmonyOS ArkUI实战开发-网页加载(Web)

移动应用开发中,网页使用的场景非常多,比如在APP内安排一个优惠活动啥的,就可以直接加载一个H5页面高效并且及时,也省去了使用原生开发要升级版本的麻烦,ArkUI开发框架提供了 Web 组件来加载一个网页,本节笔…

音频文件太大了怎么办?如何实现音乐内存压缩?超实用的音频压缩技巧分享给你

一,我们需要了解音乐文件是如何存储的。 音乐文件通常以数字格式存储,如 MP3、WAV、FLAC等。这些格式各有优缺点,但共同点是它们都需要占用一定的存储空间。文件大小取决于多个因素,包括音频质量、编码格式和采样率等。因此&…

网盘_游戏_博客自动化部署(Nginx多项目部署)

目录 一.前提介绍 二.环境介绍 三.自述(脚本) 四.关于Nginx多项目部署 一.前提介绍 在我之前的博客里详细介绍了上述项目的部署,那么如何使用简单脚本自动部署和使用Nginx多项目部署是本文来介绍的基础篇章。 二.环境介绍 CentOS Linux…

线性表的顺序存储如何设计实现?

如何存储 顺序及链式实现 计算机中的状态

springboot的开发流程

文章目录 springboot的开发流程 1.创建maven项目2.引用依赖 1)起步依赖2)项目依赖3.启动类4.配置文件5.业务代码 1)dto2)controller6.restful测试7.部署 1)打包2)部署 springboot的开发流程 1.创建maven项目 新建maven项目 配置…

键盘打字练习游戏代码

效果图 部分代码 index.html <!DOCTYPE html> <html lang"zh"> <head> <meta charset"UTF-8" /> <meta name"viewport" content"widthdevice-width, initial-scale1.0" /> <meta http-equiv"…

编程新手必看,Python3中File(文件) 方法知识点及语法学习总结(24)

**介绍&#xff1a; Python3 中的file对象提供了多种方法来操作文件&#xff0c;以下是一些常用的文件方法&#xff1a; close()&#xff1a;关闭一个已打开的文件。这是释放文件资源的重要步骤&#xff0c;通常在文件操作完成后调用。flush()&#xff1a;刷新文件的缓冲区&am…

vos3000外呼系统客户端无法安装如何解决?

如果 VOS3000 外呼系统客户端无法安装&#xff0c;可以尝试以下解决方法&#xff1a; 检查系统要求&#xff1a; 确保你的计算机满足 VOS3000 外呼系统客户端的系统要求&#xff0c;包括操作系统版本、内存、处理器等。如果系统不符合要求&#xff0c;可能会导致安装失败或者运…

AI生图美学在淘宝的实践应用

本文介绍了如何制定和应用美学标准来评估和改善人工智能生成的图像质量&#xff0c;特别是在电商领域的应用&#xff0c;主要分为制定美学标准、训练美学模型、应用美学模型、升级淘宝风格模型四个步骤。 美学的定义与分析 图像质量标准&#xff1a;现代设计框架下&#xff0c;…

《自动机理论、语言和计算导论》阅读笔记:p261-p314

《自动机理论、语言和计算导论》学习第 10 天&#xff0c;p261-p314总结&#xff0c;总计 48 页。 一、技术总结 1.generating & reachable 2.Chomsky Normal Form(CNF) 乔姆斯基范式。 3.pumping lemma 泵作用引理。引理&#xff1a;引理是数学中为了取得某个更好的…