论文解读:(VPT)Visual Prompt Tuning

news2024/11/18 21:48:51

文章汇总

要解决的问题

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

动机

只微调参数的一个子集

解决的办法

只在输入空间中引入少量特定于任务的可学习参数,而在下游训练期间冻结整个预训练的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

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

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

相关文章

STM32的GPIO控制寄存器开发

寄存器GPIO控制 寄存器地址 寄存器地址计算 某个寄存器地址,由三个参数决定:1、总线基地址(BUS_BASE_ADDR);2,外设基于总线基地址的偏移量(PERIPH_OFFSET);3&#xff…

书生·浦语 大模型(学习笔记-8)Lagent AgentLego 智能体应用搭建

目录 一、智能体出现的原因 二、智能体的定义 三、智能体的组成 四、Lagent 五、AgentLego 六、实战一(Lagent) 环境配置及安装 安装依赖 准备 Tutorial Lagent Web Demo AgentLego 使用 图片推理(结果): …

C#基础之函数基础

函数 文章目录 1、函数基础1、概念2、函数位置3、基本语法4、实际运用5、return 2、ref 和 out1、ref 和 out 使用2、区别思考 登录 3、变长参数和参数默认值1、变长参数2、参数默认值 4、函数重载5、递归函数思考1 阶乘思考2 阶乘相加思考3 竹竿减半思考4 递归循环输出 1、函数…

diskMirror-backEnd-spring-boot | diskMirror 后端服务器 SpringBoot 版本!

diskMirror-backEnd-spring-boot diskMirror 后端服务器的 SpringBoot 版本,此版本中拓展了 DiskMirrorBackEnd,是一个完全的SpringBoot项目! 目录 文章目录 diskMirror-backEnd-spring-boot目录我如何部署与配置docker 方式部署 diskMirro…

【树莓派】yolov5 Lite,目标检测,行人检测入侵报警

延续之前的程序: https://qq742971636.blog.csdn.net/article/details/138172400 文章目录 播放声音pygame不出声音怎么办(调节音量)树莓派上的音乐播放器(可选)命令行直接放歌(尝试放mp3歌曲) …

分类算法——模型评估(八)

1混淆矩阵 在分类任务下,预测结果与正确标记之间存在四种不同的组合,构成混淆矩阵(适用于多分类) TP True Possitive FN False Negative 2精确率(Precision)与召回率(Recall) 精…

第11章 Android特色开发——基于位置的服务

第11章 Android特色开发——基于位置的服务 本章中,将要学习一些全新的Android技术,这些技术有别于传统的PC或Web领域的应用技术,是只有在移动设备上才能实现的。 基于位置的服务(Location Based Service)。由于移动…

智能穿戴终端设备安卓主板方案_MTK平台智能手表PCBA定制开发

新移科技智能手表方案兼容WiFi、BLE、2~5G等多种通信能力。支持多个功能模块,包括:通话、计步、定位、睡眠监测、心率监测、血氧监测等。智能手表通过滑动与功能性按键提供高度直观的体验感受,从腕间即可掌控日常生活。形态支持定制包括&…

数据结构篇其二---单链表(C语言+超万字解析)

目录 前言: 一、顺序表的缺点和链表的引入。 二、链表概述 实现一个简单的链表 空链表的概念 三、链表的功能实现 链表的打印 链表节点的创建 链表的头插(自上而下看完分析,相信你会有所收获) 头插的前置分析 传值调用和…

【韩国】UE5的MetaHuman确实可以导入Blender进行编辑。

UE5的MetaHuman确实可以导入Blender进行编辑。根据网络上的信息,你可以将MetaHuman模型导出为FBX文件,然后在Blender中进行修改。修改完成后,你可以将其重新导入到Unreal Engine 5中4。请注意,当你在Blender中编辑模型时&#xff…

debian配置四叶草输入法

效果展示 一、前言 在linux下体验比较好的输入法只有两款:搜狗输入法、四叶草输入法。 ubuntu下可以成功配置搜狗输入法,但debian下从来没有成功过。 今天在用fcitx5 四叶草时发现VNC远程输入法会失灵,于是改用了ibus 四叶草&#xff0c…

Java | 冒泡排序算法实现

大家可以关注一下专栏,方便大家需要的时候直接查找,专栏将持续更新~ 题目描述 编写一个Java程序,实现冒泡排序算法。程序需要能够接收一个整型数组作为输入,并输出排序后的数组。 冒泡排序是一种简单的排序算法,它…

详解23种设计模式——工厂模式

工厂模式 | CoderMast编程桅杆工厂模式 设计思想 工厂模式是最常用的设计模式之一,属于创建型模式,将创建对象的权利交给了一个工厂类,从而提供了一种不使用构造方法的情况下创建对象的途径,无需指定要创建的具体类,将…

【可下载】CDA 1级教材《精益业务数据分析》2023最新版

CDA一级认证教材:《精益业务数据分析》 全面、系统地讲述业务描述性分析为企业决策行为创造价值的全流程技能,涵盖描述性数据分析方法、业务分析方法、数据分析结果应用方法等内容。 条理清晰的结构、通俗易懂的语言、完整立体的知识框架为读者铺开一幅…

word添加行号

打开页面设置,找到行号

制造型企业 如何实现便捷的机台文件统一管理?

机台文件统一管理,这是生产制造型企业都需要去做的,机台文件需要统一管理的原因主要包括以下几点: 1、提高效率:统一管理可以简化文件的访问和使用过程,提高工作效率,尤其是在需要频繁访问或更新机台文件的…

数据库MySQL的初级基础操作

文章目录 1. 介绍2. 数据库相关概念3. 启动4. 数据模型5. SQL6. DDL数据库DDL-表操作DDL-表操作-数据类型DDL-表操作-修改DDL-表操作-删除 7. 图形化界面工具DataGrip8. DML(数据操作语言)DML-添加数据DML-修改数据 9. DQL(数据查询语言)基本查询条件查询…

如何把经验变成可以销售的“知识产品”?

知识付费,很多人想做,但是不知道如何把自己在某方面的“经验”,变成一个“知识产品”,那么这篇文章,我们就来聊聊如何从0打造一个知识产品 非常简单,一共六个步骤: 第一步:取名字&…

【安卓13-Framework】SystemUI定制之屏蔽下拉状态栏部分快捷按钮

1、需求 屏蔽下拉状态栏谷歌录屏、省电模式、二维码扫描器等快捷按钮。 2、修改路径 普及:安卓的SystemUI包提供了状态栏、导航栏、通知中心等重要的用户界面元素。 状态栏小部件UI显示修改路径:frameworks/base/packages/SystemUI/src/com/android/s…

政安晨:【Keras机器学习示例演绎】(十七)—— 用于图像分类的 RandAugment 可提高鲁棒性

目录 导入与设置 加载 CIFAR10 数据集 定义超参数 初始化 RandAugment 对象 创建 TensorFlow 数据集对象 可视化使用 RandAugment 增强的数据集 可视化使用 simple_aug 增强的数据集 定义模型构建实用功能 使用 RandAugment 训练模型 用 simple_aug 训练模型 加载 C…