E2VPT: An Effective and Efficient Approach for Visual Prompt Tuning

论文汇总

存在的问题

1.以前的提示微调方法那样只关注修改输入,而应该明确地研究在微调过程中改进自注意机制的潜力,并探索参数效率的极限。

2.探索参数效率的极值来减少可调参数的数量?

解决办法

提示嵌入进行transformer中

提示剪枝

Token-wise Pruning

Token-wise Pruning对prompt生成一个mask, ρ = { ρ 1 , ρ 2 , … , ρ M } , ρ k ∈ { 0 , 1 } \rho=\{\rho_1,\rho_2,\ldots,\rho_M\},\rho_k\in \{0,1\} ρ={ρ1,ρ2,,ρM},ρk{0,1} ( M M M为可视提示符的长度)。 ρ k ∈ { 0 , 1 } \rho_k\in \{0,1\} ρk{0,1} 代表第 i i i 个token的重要程度,0代表这个token被丢弃, P ~ k = ρ k ⋅ P k \tilde{P}_k=\rho_k\cdot {P}_k P~k=ρkPk

Segment-wise修剪

Segment-wise修剪对Token-wise Pruning之后的Token做进一步的剪枝,具体来说就讲Token-wise Pruning之后的Token分为 R R R 个part,将每个part视为一个整体。每一个part也有一个类似于Token-wise Pruning的 ρ \rho ρ 变量,表示每一个part的Token是否需要被抛弃。

摘要

随着基于transformer的模型的规模不断增长,为新任务微调这些大规模预训练的视觉模型已经变得越来越参数密集。参数高效学习是为了减少微调过程中可调参数的数量。尽管这些方法显示出很好的结果,但与完全微调相比,仍然存在显着的性能差距。为了解决这一挑战,我们提出了一种有效和高效的视觉提示调谐(E2VPT)方法,用于大规模基于变压器的模型自适应。具体来说,我们在自注意层和输入层分别引入了一组可学习的键值提示和视觉提示,以提高模型微调的有效性。此外,我们设计了一个提示剪枝程序,在保持模型性能的同时系统地修剪低重要性提示,大大提高了模型的效率。实证结果表明,我们的方法在两个基准上优于几个最先进的基线,参数使用率相当低(例如,VTAB-1k上的模型参数使用率为0.32%)。我们的代码可在https://github.com/ChengHan111/E2VPT上获得。

1. 介绍

人工智能(AI)的发展不仅应优先考虑性能进步,还应强调可持续部署[64,78,80,87]。尽管人们对视觉相关任务的性能改进有着迷人的追求,但目前模型的规模一直在迅速增加,这导致了能量密集型和计算成本高昂的训练[31,73,92]。基于transformer的架构目前主导着视觉相关模型,如ViT-Huge [12] (632M)和Swin-Large [54] (197M),它们的参数明显多于卷积神经网络(CNN)像ResNet [26] (25M)。从头开始训练如此大的模型存在着数据有限[5,20,75]和低精度下缓慢收敛[37,47]等挑战。克服这些挑战的一个常见范例是预训练-然后微调,它减少了对大量训练数据的需求,并加快了各种视觉任务的处理速度。然而,传统的全调优涉及到为每一个任务存储和部署backbone参数的完整副本[34],计算成本很高,不适合快速模型部署。

图1所示。在预训练之后微调的范式下,$ \text{E}^2 \text{VPT} $(我们的)与其他工作(即部分调谐[91],额外模块[6]和提示调谐[34]方法)。与最先进的微调方法相比,我们的方法获得了可靠的性能提升,并且在采用预训练的ViT-Base/16[12]作为主干的广泛分类任务上具有完全微调的竞争力,参数使用量相当低(见表1)。颜色分别表示VTAB-1k[96]上的结果:Specialized, Natural和Structure。

为了解决这个问题,已经开发了各种方法,可分为三大类(见图1):部分调优、额外模块和提示调优方法。部分调优方法[10,35,58]只对骨干的一部分进行微调,如分类器头部或最后几层,而冻结其他部分。额外的模块方法将可学习的偏置项[6]或额外的适配器[70,98]插入网络以进行适应。提示调谐方法在变压器的输入层添加提示令牌[34,36,94],而不改变或微调主干本身。所有这些方法都是在预训练后微调的模式下运行的,与完全微调相比,这减少了可学习参数的数量[10,35,58,70,98]。

然而,尽管取得了令人鼓舞的结果,但现有的参数高效方法存在两个主要局限性。首先,他们没有仔细检查transformer自关注机制的核心架构,导致完全微调的性能差距很大。其次,它们通常需要对相对大量的参数进行微调以达到合理的性能,而无法探索参数效率的极值。

以上概述的观点引出了两个基本问题:

1:我们如何才能为大规模基于transformer的视觉模型建立快速调整的有效性?

2:我们如何探索参数效率的极值来减少可调参数的数量?

这两个问题是我们工作的基础。直觉是,我们不应该像以前的提示调整方法那样只关注修改输入,而应该明确地研究在微调过程中改进自注意机制的潜力,并探索参数效率的极限

为了回答问题1,我们讨论并分析了transformer的自关注机制,该机制对于在全局上下文中捕获远程令牌依赖关系至关重要[21,38,49]。除了输入视觉提示外,我们还引入了可学习的键值提示,并将它们集成到自注意层的键值矩阵中。在微调期间,键值提示与输入可视提示一起学习。这种方法有效地利用了设计良好的transformer提示体系结构,从而显著提高了性能。此外,它为电流互感器架构提供了一个通用的即插即用提示模块,其微调解决方案在概念上不同于前面提到的视觉领域的所有技术。

在问题2的激励下,我们提出了一种修剪策略,在保持模型性能的同时进一步减少参数的数量。我们的方法从彩票假设(LTH)中获得灵感[16,102],它假设对于给定的任务,存在一个子网络,该子网络可以匹配原始过参数化网络的测试精度,而不需要不必要的权重[22,23,41,43,44]。在此范例的基础上,我们重新审视了提示调优方法的核心设计,并进一步减少了可学习参数的数量。具体来说,我们的目标是保留对性能有重大贡献的提示令牌,同时在微调期间修剪冗余或不必要的提示令牌。通过修剪这些不必要的提示,我们可以在保持性能的同时显著提高提示调优效率。

为了回答问题1-2,我们提出$ \text{E}^2 \text{VPT} $,即Effective and Efficient Visual Prompt Tuning。e2vpt是一种新颖的提示调优框架,它既具有架构意识,又具有修剪锚定(见图1)。在§2中,我们进行了文献综述并讨论了相关工作。我们提出的方法在§3中提出,在那里我们详细描述了我们如何设计视觉和键值提示,以更少的参数实现卓越的性能。在§4中,我们在各种基准、主干和不同的预训练目标上提出了令人信服的实验结果。具体来说,我们的方法在VTAB-1k上的准确率比完全调优平均提高了5.85%,比VPT平均提高了1.99%[34]。此外,我们的方法使用的可学习参数比现有方法少得多,平均只占VTAB-1k主干参数的0.32%,而VPT平均需要0.68%(见图1)。我们进一步证明并解释了我们的方法比双曲可视化的VPT的优越性。最后,我们在附录中展示了我们的方法在语言领域的强大算法泛化。我们相信这项工作能为相关领域提供有价值的见解。

2. 相关工作

2.1. 视觉Transformers

受transformer在自然语言处理(NLP)中取得的巨大成功的启发[5,11,52,69,79,83],研究人员将transformer架构扩展到各种监督视觉任务,包括图像分类[12,53,54,56],图像分割[46,51,74,82,84,86,100],目标检测[4,7,50,66,93,101]和姿态估计[29,30,48,90])。自监督预训练范式[3,10,24]也得到了探索,并得到了最先进的结果。与卷积神经网络(cnn)相比,transformer因其优越的性能和可扩展性而在视觉相关学科中占据主导地位[27,34]。然而,使transformer适应各种视觉任务所需的大量计算和参数开销也不容忽视[15,33,97]。例如,最近基于transformer的模型,如MViTv2Large [45] (218M)、vitg [95] (1.8B)、SwinV2-G [53] (3.0B)和V-MoE [72] (14.7B),会产生大量的计算成本。因此,我们提出$ \text{E}^2 \text{VPT} $,旨在降低基于transformer的架构的计算成本,同时在预训练-然后微调范式中保持高性能。

2.2. 参数高效微调

高效的模型训练已经引起了视觉界的广泛关注,尤其是随着视觉transformer的兴起[1,8,12,54,85]。然而,尽管这些模型非常有效并被广泛使用,但它们对于实际部署和调整来说往往过于庞大。因此,通常采用预训练-然后微调范式。虽然完全微调确保了强大的性能,但这是一种涉及更新所有网络参数的昂贵方法[27,75]。为了克服这一挑战,研究人员正在探索平衡参数效率和鲁棒性能的替代方案,可大致分为三组:部分调优、额外模块和提示调优方法。

部分调优方法被广泛用于参数高效的微调。这些方法包括冻结大部分主干,只微调一小部分参数,如线性[32]或MLP磁头[9],或主干的几个块/层[24,65,91,99]。虽然这些方法直接且易于实现[10,35,58],但与完全微调相比,它们通常存在很大的性能差距。额外的模块方法设计了额外的可学习的插件架构进行微调。例如,[98]中的工作在冻结原始网络的同时交替引入了一个侧结构。[6,70]中的作品将额外的残余单元插入主干。然而,这些方法的一个缺点是插入的模块通常是针对特定的体系结构定制的,可能无法推广到其他体系结构。

此外,与部分调优方法相比,这些模块通常消耗更多的参数。提示调整或提示[28,42,57,89]最初被提出用于语言领域的快速模型自适应。这些方法将一组可学习的向量添加到主干的输入中,并且仅在微调期间更新这些特定于任务的提示。最近,在视觉领域引入了视觉相关提示[18,34,88],它在输入序列中设计视觉提示,并在完全微调的情况下显示出具有竞争力的性能。然而,目前的方法没有考虑基于transformer的体系结构的内部设计,导致不太有效的提示解决方案。相比之下,我们的方法注意到架构并锚定在修剪上,这在概念上将其与上述方法区分开来。

3. 我们的E2VPT方法

在本节中,我们将介绍E2VPT,这是一种新颖的视觉提示调谐方法,用于有效和高效的大规模基于transformer的模型微调。我们首先在§3.1中定义这个问题和记号。在§3.2中介绍了通过设计视觉和键值提示符进行有效的提示调优,然后在§3.3中介绍了有效的提示修剪。总体框架如图2所示。

3.1. 问题定义

在本节中,我们定义了 E 2 VPT \text{E}^2 \text{VPT} E2VPT 问题并提供了相关符号。假设我们有一个主干视觉transformer器模型 T \textbf{T} T,它在大量数据和任务上进行了预训练。视觉transformer的输入是一系列图像补丁 I = { I 1 , I 2 , … , I m } I=\{I_1,I_2,\ldots,I_m\} I={I1,I2,,Im},其中 m m m为图像补丁总数。然后用位置编码将每个patch投影到 d d d维嵌入中,即 E = { E j ∣ 1 ≤ j ≤ m } E=\{E_j|1\le j\le m\} E={Ej∣1jm},其中 E j = Emb ( I j ) E_j=\text{Emb}(I_j) Ej=Emb(Ij)。视觉transformer T \textbf{T} T N N N 个相同的transformer层组成,表示为:

这里的每个transformer层都是多头自关注(MSA)和前馈网络(FFN)的堆栈:

给定一个新的视觉任务,目标是微调一个模型 T ^ \hat{\textbf{T}} T^,在只调整少量参数的情况下,在任务上提供良好的性能。在视觉提示调优的上下文中, T ^ = { T , P } \hat{\textbf{T}}=\{\textbf{T},\textbf{P}\} T^={T,P},其中包括一个冻结的主干 T \textbf{T} T,以及具有很少可调参数的可训练提示 P \textbf{P} P

3.2. 有效的提示

图2。E2VPT框架概述。在预训练-然后微调范式下,只有transformer输入和主干(§3.2)中的提示在微调过程中更新,而所有其他组件保持冻结。在(d)中,我们进一步在两个粒度级别(即,标记明智和分段明智)上引入修剪(§3.3),以消除倒带期间不利的输入提示。

大多数现有的提示调优方法侧重于通过将一组视觉提示添加到transformer层的输入序列来调优,而没有考虑变压器体系结构的内部设计。然而,为了提高提示调优的有效性并实现最佳的微调性能,我们提出了一种新的方法,在我们的视觉提示调优框架中,除了输入视觉提示( P I \textbf{P}_I PI )外,还包含一组键值提示( P K \textbf{P}_K PK P V \textbf{P}_V PV )。直观地,输入视觉提示被插入到每个编码器层的输入序列中,这些编码器层学习表示新任务。键值提示与自注意模块中的键和值参数矩阵连接在一起,该模块学习从数据中捕获新的注意模式。

视觉提示。视觉提示是一组与输入视觉标记具有相同维度的 d d d 维嵌入向量。它们被附加到每个transformer编码器层的输入序列中,并与所有输入令牌交互。视觉提示的作用与传统提示调优方法中的提示符号类似[34,42],它们学习特定于任务的嵌入,以指导模型在新任务上执行。

正式地,这些视觉提示被定义为 P I = { P I 1 , P I 2 , … , P I N } P_I=\{P^1_I,P^2_I,\ldots,P^N_I\} PI={PI1,PI2,,PIN},其中 P I i P^i_I PIi 为可学习视觉在第i层编码器中提示, N N N为总层数。然后编码器层表示为:

其中 Z i Z^i Zi 表示由第 i i i层编码器计算的上下文嵌入。不同的颜色分别表示可训练参数和固定参数。对于输入图像patch E E E的嵌入,它们是用主干的冻结Emb投影进行初始化的。

键-值提示。视觉提示对于学习新任务的知识很有用。然而,它们在指导transformer编码器层之间的信息交互方面存在不足。原因是当对新数据进行微调时,图像分布可能与用于预训练骨干模型的图像示例中的图像分布有很大不同。因此,增强模型从微调数据中捕获新信息的能力以及在输入令牌之间进行更有效的关注以学习新模式是至关重要的。

为此,我们提出了一种新的方法,通过引入一组新的键值提示, P K P_K PK P V P_V PV,它们被合并到每个编码器层的注意力模块中(如图2(a)所示)。这些键-值提示是只有几列的小矩阵,但与原始注意力模块中的键和值矩阵共享相同的行数。为了执行新的注意力计算,键和值矩阵分别与相应的 P K P_K PK P V P_V PV 提示符相连接。这个过程定义如下:

其中FFN为前馈网络,MSA为编码器层内的多头注意。 h h h 表示第 h h h 个头。 K ′ K' K V ′ V' V 是新的键和值嵌入矩阵,定义为:

其中, K K K V V V 表示主干中的原始键矩阵和值矩阵。通过这种方式,键值提示可以帮助指导模型适应新数据。在我们的实现中,我们更进一步,在每个transformer层中启用 P K P_K PK P V P_V PV 提示的参数共享,而不是调整单独的可学习向量。我们的动机是双重的:首先,我们的实验结果表明,在共享提示的情况下,跨实例的微调性能持续提高;其次,使用共享提示向量将可学习transformer部分的参数使用减少了一半,使其更具参数效率。我们在§4.3中提供了关于探索提示位置(即,在 K K K V V V 之前或之后)的讨论。

值得注意的是,查询矩阵 Q Q Q 是自注意机制中的另一个关键元素。然而,不需要对 Q Q Q 进行额外的提示,原因有二:首先,对 Q Q Q 进行提示类似于对 K K K 进行前置以计算每对 Q Q Q K K K 之间的注意分数,因此,对 Q Q Q K K K 都进行提示是不必要的;其次, Q Q Q 的变化会影响注意力图的输出形状,需要对下一层不匹配的维度进行额外的线性投影。在参数高效设计下,这是无法承受的。更多的实验和讨论将在附录中提供。

3.3. 有效的促使

我们的有效提示方法旨在提高微调模型的性能。然而,一个自然的问题出现了:我们能否在不牺牲模型性能的情况下减少可调提示的数量?彩票假设(lottery ticket hypothesis, LTH)[16,102]指出,对于给定的任务,存在一个子网络,在不需要不必要的权重的情况下,可以达到与原始过参数化网络相同的测试性能。在这一假设的推动下,我们进行了一个实验,我们掩盖了不同的视觉提示,发现不同的提示对模型的性能有不同的影响,有些甚至有负面影响。这一观察结果与以往的研究一致[43,57]

基于我们的发现,我们提出了一种对视觉提示进行快速修剪的方法。这种方法的主要目标是保留最有影响的提示,同时消除冗余或不必要的提示。通过删除不太重要的提示,我们可以在保持性能的同时显著提高提示调优的效率。

为了实现这一目标,我们设计了一个级联修剪策略,该策略在两个粒度级别上运行,即令牌修剪和分段修剪,如图2(d)所示。标记智能修剪最初识别并删除最不重要的视觉提示。在此步骤之后,分段式修剪将每个剩余提示划分为多个片段并过滤掉负面片段。通过共同减少可学习视觉提示中的参数使用,我们的两级修剪方法创建了软过滤提示,可以在倒带阶段重新训练。

Token-wise修剪。我们引入一个可学习掩模变量 ρ = { ρ 1 , ρ 2 , … , ρ M } \rho=\{\rho_1,\rho_2,\ldots,\rho_M\} ρ={ρ1,ρ2,,ρM} ( M M M为可视提示符的长度),并将其与各transformer层的输入可视提示符相关联。式中 ρ k ∈ { 0 , 1 } \rho_k\in \{0,1\} ρk{0,1},其中0表示对相应的可学习输入提示进行剪枝。然后,屏蔽版本的视觉提示变成 P ~ k = ρ k ⋅ P k \tilde{P}_k=\rho_k\cdot {P}_k P~k=ρkPk 。为了确定修剪位置,我们计算每个提示符号的重要性分数[16,57],并消除得分最低的位置。重要性分数定义为模型对掩模变量 ρ k \rho_k ρk 的期望灵敏度[60]:

式中, L \mathcal{L} L 为损失函数, D x \mathcal{D}_x Dx 为训练数据分布[60]。分配给每个视觉提示的重要性分数反映了它对微调性能的贡献。低重要性分数表明提示对微调过程的贡献很小,甚至是负的。相反,高重要性分数表明提示是有意义和有用的,对微调过程有重大贡献。

Segment-wise修剪。我们进一步研究了分段修剪,以排除每个提示内的负面提示段。每个提示令牌的嵌入首先平均分成$ R $部分。每个部分作为一个独立的单元,可以共同优化。类似于标记式修剪,然后我们为提示标记内的每个片段分配一个掩码变量,并过滤掉那些重要性分数低的片段。

Rewinding。在执行两级级剪枝之后,权值倒卷阶段的重点是重新训练软过滤的提示令牌。这个过程包括在修剪阶段对每个层的重要性评分进行排序,当其重要性评分相对较低时,将相应的掩码变量设置为0。接下来,在微调过程中,使用学习率和权重衰减的原始组合,将软过滤输入提示与其他可学习参数一起重新训练。

4. 实验

参考资料

论文下载(ICCV 2023)

https://arxiv.org/abs/2307.13770

代码地址

https://github.com/ChengHan111/E2VPT

参考资料

https://zhuanlan.zhihu.com/p/671299605

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

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

相关文章

OpenCV_距离变换的图像分割和Watershed算法详解

在学习watershed算法的时候,书写代码总会出现一些错误: 上述代码运行报错,显示OpenCV(4.10.0) Error: Assertion failed (src.type() CV_8UC3 && dst.type() CV_32SC1) in cv::watershed 查找资料:目前已解决 这个错…

CentOS7搭建Hadoop3集群教程

一、集群环境说明 1、用VMware安装3台Centos7虚拟机 2、虚拟机配置:2C,2G内存,50G存储 3、集群架构设计 从表格中,可以看出,Hadoop集群,主要有2个模块服务,一个是HDFS服务,一个是YAR…

wordpress更换域名后用户图片头像不显示

🏆本文收录于《全栈Bug调优(实战版)》专栏,主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&am…

【Python报错已解决】AttributeError: ‘DataFrame‘ object has no attribute ‘append‘

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 专栏介绍 在软件开发和日常使用中,BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

基于深度学习的文本情感原因提取研究综述——论文阅读

前言 既然要学习情感分析,那么肯定还要了解情感原因对抽取的发展历程,所以我又搜了一篇研究综述,虽然是2023年发表的,但是里面提及到的历程仅停留到2022年。这篇综述发布在TASLP期刊,是音频、声学、语言信号处理的顶级…

【论文解读系列】用于自监督点云表示的生成变分对比学习

Generative Variational-Contrastive Learning for Self-Supervised Point Cloud Representation | IEEE Transactions on Pattern Analysis and Machine Intelligence (acm.org) 作者:Bohua Wang; Zhiqiang Tian; Aixue Ye; Feng Wen; Shaoyi Du; Yue Gao 摘要 三…

Coggle数据科学 | 科大讯飞AI大赛:玉米雄穗识别挑战赛

本文来源公众号“Coggle数据科学”,仅用于学术分享,侵权删,干货满满。 原文链接:科大讯飞AI大赛:玉米雄穗识别挑战赛 赛题名称:玉米雄穗识别挑战赛 赛题类型:计算机视觉、物体检测 赛题任务&…

LeetCode_sql_day30(1264.页面推荐)

描述 1264.页面推荐 朋友关系列表: Friendship ------------------------ | Column Name | Type | ------------------------ | user1_id | int | | user2_id | int | ------------------------ (user1_id, user2_id) 是这张表具有唯一值的…

HT326 免电感滤波2x20W D类立体声音频功放

特点 输出功率(BTL模式) 2x20W (VDD14.5V,RL4Ω,THDN1%) 单电源系统: 4.5V-18V; 超过90%效率,无需散热器 扩频功能,免电感滤波 模拟差分/单端输入可选 增益:32dB 保护功能:过压/过流/过热/欠压异常,直流检测 和短路保护 无铅无卤封装&#x…

Python画笔案例-054 绘制流光溢彩动画

1、绘制流光溢彩动画 通过 python 的turtle 库绘制 流光溢彩动画,如下图: 2、实现代码 绘制流光溢彩动画,以下为实现代码: """本程序实现流光溢彩的动画效果 """ from turtle import * from color…

流动网红打卡车!苏州金龙海格双层巴士带你体验别样津门津韵

近日,由文化和旅游部主办,天津市文化和旅游局等单位承办的2024中国文化旅游产业博览会在天津拉开帷幕,展会期间,来自全国各地的文旅产品精彩亮相。而在天津交通集团展台,来自苏州金龙海格客车制造的网红双层观光“音乐…

YOLOv8改进 - 注意力篇 - 引入ECA注意力机制

一、本文介绍 作为入门性第一篇,这里介绍了ECA注意力在YOLOv8中的使用。包含ECA原理分析,ECA的代码、ECA的使用方法、以及添加以后的yaml文件及运行记录。 二、ECA原理分析 ECA官方论文地址:ECA文章 ECA的pytorch版代码:ECA的…

Unet改进41:添加gConvBlock(2024最新改进方法)|

本文内容:在不同位置添加gConvBlock 目录 论文简介 1.步骤一 2.步骤二 3.步骤三 4.步骤四 论文简介 图像去雾是低层次视觉中的一个活跃话题,随着深度学习的快速发展,许多图像去雾网络被提出。尽管这些网络的管道运行良好,但改善图像去雾性能的关键机制仍不清楚。因此…

[Simpfun游戏云1]搭建MC Java+基岩互通生存游戏服务器

众所周知,MC有多个客户端,像常见的比如Java Edition和基岩等,这就导致,比如我知道一个超级好玩的JE服务器,但我又想使用基岩版来玩,肯定是不行的,因为通讯协议不一样。 这就有一些人才发明了多…

【linux】4张卡,坏了1张,怎么办?

先禁用这张卡 grub 禁用,防止加载驱动 禁用这张卡的 PCI # 禁用 PCI 设备 0000:b1:00.0 (NVIDIA GPU) ACTION"add", SUBSYSTEM"pci", ATTR{vendor}"0x10de", KERNELS"0000:b1:00.0", RUN"/bin/sh -c echo 0000:b1:00…

javaseday28 IO

IO流 IO流;存储和读取数据的解决方案。 纯文本文件:Windows自带的记事本打开能读懂的文件,word和Excel不是纯文本文件,txt和md是纯文本文件。 小结 IO流体系 FileOutputStream public class Demo1 {public static void main(String[] args)…

Ping32加密利器 vs ipguard,企业数据防护的实战对比

在数字化时代,企业数据的安全防护已成为不可忽视的重要议题。随着数据泄露事件的频发,企业迫切需要采用高效、可靠的数据防泄漏解决方案来保护其敏感信息。Ping32和IP-Guard作为市场上备受瞩目的两款数据保护工具,各自以其独特的功能和优势赢…

深入分析几个难以理解的Comparator源码

1.分析comparing单参数方法 网上很多帖子说实话,不咋地,讲的不细节,抄来抄去,就让我这个大二的垃圾,给大家梳理一下Comparator这几个难以理解public static方法吧。 1.1函数式接口Function 这个函数是使用的函数式编程…

OrCAD使用,快捷键,全选更改封装,导出PCB网表

1 模块名称 2 快捷键使用 H: 镜像水平 V:镜像垂直 R: 旋转 I: 放大 O: 放小 P:放置元器件 W: 步线 B: 总线(无电气属性) E: 总线连接符(和BUS一起用&#xff09…

图的应用(关键路径)

基于你设计的带权有向无环图,写出所有合法的关键路径,并算出关键路径总长度 文字描述:关键路径总长度的现实意义是什么? 1.关键路径 总长度454316 2.现实意义 从源点到汇点的所有路径中,具有最大路径长度的路径称…