当前位置: 首页 > news >正文

DeCoOp: Robust Prompt Tuning with Out-of-Distribution Detection

文章汇总

me:看得很迷糊

新型检测器 M D \mathcal M_D MD的训练是为了对一个子基类去划分子基类中的base和new。

在获得每个子基类之后,为每个检测器训练子分类器 M C \mathcal M_C MC

在推理时,如果最高得分的检测器 M D i ( x ) \mathcal M^i_D(\bm x) MDi(x)认为这个数据是否来自新类,如果是我们就用zero-shot classifier,否则我们去找到效果最好(置信度最高)的子分类 M C i ( x ) M^i_C(\bm x) MCi(x)的预测结果作为最终结果。

其中 i ∗ = arg max i ∈ { 1 , … , K } M D i ( x ) i^*=\text{arg max}_{i\in \{1,\ldots,K\}}{\mathcal M^i_D(\bm x)} i=arg maxi{1,,K}MDi(x)(me:总感觉这个公式是 i ∗ = arg max i ∈ { 1 , … , K } M C i ( x ) i^*=\text{arg max}_{i\in \{1,\ldots,K\}}{\mathcal M^i_C(\bm x)} i=arg maxi{1,,K}MCi(x)

摘要

视觉语言模型(VLM),例如CLIP,已经为各种下游任务展示了令人印象深刻的零射击能力。通过一些提示调优方法可以进一步提高它们的性能。然而,目前的研究分别在基础课和新课上评估学习过的提示的表现。这种评估对于实际应用程序缺乏实用性,因为下游任务无法提前确定数据是属于基类还是新类。在本文中,我们探讨了一个名为开放世界提示优化(OPT)的问题设置,它涉及对基类的优化提示以及对基类和新类的组合进行评估。通过引入分解提示调优框架(DEPT),从理论上证明了在提示调优中加入分布外检测可以解决OPT问题,从而增强了从基到新的可分辨性。在DEPT的基础上,我们提出了一种新的提示调优方法,即分解上下文优化(DECOOP),该方法引入了新类检测器和子分类器,进一步增强了基类和新类的可分辨性。在11个基准数据集上的实验结果验证了DEPT的有效性,并证明DECOOP优于最先进的方法,平均准确率提高了2%。

1. 介绍

视觉语言模型(VLM),如CLIP (Radford等人,2021),已经开发用于对齐图像和语言,展示了令人印象深刻的零样本能力对于多种下游任务(Deng et al ., 2009;Maji et al ., 2013;Krause et al, 2013),仅使用类名。分类预测是通过使用提示技术计算图像编码器生成的图像嵌入与文本编码器生成的文本嵌入之间的余弦相似度来确定的(Liu et al, 2023)。例如,输入“a photo of class”,文本编码器生成相应的文本嵌入,其中“class”表示类名。

此外,还可以提高CLIP的性能,特别是在处理具有有限标记数据的下游任务时。少样本提示调谐方法(Lu et al ., 2022;周等,2022b;Shu等人,2022b)在保持其他参数不变的情况下,利用下游数据集中的少量标记数据对可学习提示进行微调。在下游分类任务中,这些方法与零样本VLMs相比可以产生实质性的性能改进。然而,以往的研究(Zhou et al ., 2022a;Wang et al ., 2023b)已经确定了一个限制,即学习到的提示只能有效地操作基类中的标记数据。这一限制导致在训练集中看不见的新类的零样本性能下降。为了解决这个问题,研究人员提出了一种评估范式,分别评估基本类和新类的性能,以及它们的谐波平均值,即H度量。

尽管这种评估范式可以全面评估基类和新类的性能,但它对于实际应用程序缺乏实用性,这需要事先知道下游任务中的数据是属于基类还是新类。例如,在生物基础的背景下(Hayes等人,2021;Kudithipudi et al, 2022)和视觉分类(Lange et al, 2022;Mai et al ., 2022),测试期间出现的基类和新类将一起评估。

图1所示。OPT评估范例的说明。在训练过程中,我们使用来自基类的数据对模型进行微调。在测试期间,我们在基类和新类的混合上评估模型。

因此,我们引入了一个现实的问题设置,即开放世界提示调谐(OPT),它在使用基类训练模型时评估模型在基本类和新类混合上的性能。图1显示了OPT问题的示例。图2的结果表明,在评估基本类和新类的组合时,H指标的变化并不是性能提高或下降的必要指标,这凸显了OPT问题的重要性。

图2。与零样本基线CLIP方法相比,CoOp和SHIP方法的Delta性能。子图(a)和(b)表明,H度量的变化不是性能改进或精度下降的必要指标,突出了解决OPT问题的重要性。

为了解决OPT问题,我们首先分析了原始问题,该问题由三部分组成:基类到新类的可判别性、基类可判别性和新类可判别性。我们观察到,现有的方法和设置未能充分考虑基础到新辨别能力。在此分析的激励下,我们提出了DEPT框架,该框架将out-distribution(OOD)检测纳入提示调优中,以增强基到新类的可辨别性,从而防止新类的性能下降。我们从理论上证明了DEPT框架与零样本基线和提示调优方法相比可以提高性能。在DEPT框架的基础上,我们引入了一种新的提示调优方法,称为分解上下文优化(DECOOP)。该方法结合了新类检测器和子分类器,分别进一步增强了基类和新类的可分辨性。实证结果验证了DEPT框架的有效性,并证明DECOOP方法在很大程度上优于当前最先进的(SOTA)方法。

本文的贡献总结如下:

(1)我们探索了一个实际的OPT问题,并将其分解为两个子问题:OOD检测和提示调谐。通过分解,我们发现基础到新的可辨别性对于解决OPT至关重要,但在现有方法和设置中却被忽视了。

(2)提出了一种新的DEPT框架,将OOD检测引入到提示调谐中。理论分析和实验结果都证明了DEPT框架对OPT的有效性。

(3)在DEPT框架的基础上,提出了一种新的提示调优方法DECOOP,该方法通过引入新类检测器和子分类器,增强了基类和新类的可判别性。

(4)我们使用11个基准数据集对DECOOP进行了全面的实验。结果表明,我们提出的方案优于当前的SOTA比较方法,准确率平均提高了2%。

2. 问题与分析

在本节中,我们首先描述OPT设置的概念和问题表述。随后,我们使用真实世界的数据集进行了实证分析(Krause et al, 2013),其中我们确定了需要解决的两个主要挑战:基础到新类别的可辨别性和新类别的可辨别性。最后,我们对原始问题进行了分解,证明了OOD检测技术的引入可以有效地解决这两个问题。

2.1. 问题公式化

我们关注多类分类问题的提示调优设置,这些问题涉及输入空间 X \mathcal{X} X、类空间 Y = Y b ∪ Y n = [ C ] \mathcal{Y}=\mathcal{Y}_b\cup \mathcal{Y}_n=[C] Y=YbYn=[C]和文本空间 τ \tau τ,其中 C C C表示类的数量。这里, Y b \mathcal{Y}_b Yb表示基类的集合, Y n \mathcal{Y}_n Yn表示新类的集合。第 i i i类的名称记为 t i ∈ τ t_i \in \tau tiτ。其中, x ∈ X x\in \mathcal{X} xX表示数据。 f ( x ) ∈ Y , g ( x ) ∈ { b , n } f(x)\in \mathcal{Y},g(x)\in \{b,n\} f(x)Y,g(x){b,n}表示 x x x的标签及其所属的特定类空间,其中 f f f g g g是标签的真值与类空间的映射函数。

在OPT问题中,我们给出一个预训练的视觉语言模型 F = { E V , E T } \mathcal{F}=\{E_V,E_T\} F={EV,ET},该模型由视觉编码器 E V : X → R d E_V:\mathcal{X} \rightarrow \mathbb{R}^d EV:XRd和文本编码器 E T : τ → R d E_T:\tau \rightarrow \mathbb{R}^d ET:τRd组成,其中 d d d表示模型 F \mathcal{F} F的维数。在训练阶段,我们在包含来自 Y b \mathcal{Y}_b Yb的数据的少样本数据集 D \mathcal{D} D上学习提示向量 p p p。为了简化符号,我们将 t i ( p ) t_i(\bm p) ti(p)定义为类名 t i \bm t_i ti和学习提示 p \bm p p的标记的连接。因此,为每个类生成权重向量 { w i ( p ) } i = 1 C \{\bm w_i(\bm p)\}^C_{i=1} {wi(p)}i=1C作为文本嵌入,其中 w i ( p ) = E T ( t i ( p ) ) / ∣ ∣ E T ( t i ( p ) ) ∣ ∣ \bm w_i(\bm p)=\bm E_T(t_i(\bm p))/||\bm E_T(t_i(\bm p))|| wi(p)=ET(ti(p))/∣∣ET(ti(p))∣∣。在测试阶段,给定从 Y \mathcal{Y} Y中提取的测试数据 x \bm x x,我们初步得到其视觉嵌入 z = E V ( x ) / ∣ ∣ E V ( x ) ∣ ∣ \bm z=\bm E_V(x)/||\bm E_V(x)|| z=EV(x)/∣∣EV(x)∣∣。随后,我们计算预测概率如下:

其中 τ \tau τ为VLMs测定的温度。为方便起见,在后续的论文中,我们也将使用 P ( x ) P(\bm x) P(x)来表示 P ( y ∣ x ) P(y|\bm x) P(yx)。对 x \bm x x的预测由 arg max y ∈ Y P ( y ∣ x ) \underset{y\in \mathcal{Y}}{\text{arg max}}P(y|\bm x) yYarg maxP(yx)给出。OPT的目标是训练一个模型,该模型可以对 Y \mathcal{Y} Y(包括基本类和新类)进行鲁棒预测,而不会因为新类的存在而导致整体性能下降。在接下来的分析和实验中,我们对OPT问题进行了零点基线法(简称ZS)和提示调优法(简称PT)的比较。

2.2. 问题分析

图3。ZS和PT方法区分基类和新类数据的性能(基到新区别性)。

图4。ZS和PT方法在新类中区分数据的性能(新类可判别性)。

为了解决OPT问题,我们研究了一个现实世界的数据集(Krause et al, 2013),对OPT固有的挑战进行了详细的分析。我们的观察表明,虽然提示调优方法可以提高基类的可辨别性,但它们会损害基类到新类的可辨别性和新类的可辨别性。为了说明这一观察结果,我们在图3和图4中展示了ZS方法和PT方法之间的比较,其中我们使用CLIP作为ZS方法,使用CoOp作为PT方法。

图3表明,与零样本基线相比,提示调优方法导致base-to-new区别性降低。具体来说,使用MSP技术(Hendrycks & Gimpel, 2016)检测新类的AUROC降低了,并且为基类引入了更多的假阳性预测。此外,图4说明了我们强调,现有的H度量不能测量基类到新类的区别性,因此不适合全面的实际应用。在OPT问题中,在整个类空间中评估准确率可以有效地解决这一限制。

2.3. 问题分解

以上分析表明,零样本基线在新类可分辨性和基到新可分辨性方面都优于提示调优方法。这一发现促使我们将OOD检测技术与ZS法和PT法相结合。该方法旨在使用ZS保持新类的可分辨性,同时使用PT增强基类的可分辨性。因此,我们将原分类问题分解为单独的OOD检测和两个分类问题:

其中 k k k为简单起见总是等于 g ( x ) g(x) g(x),表示 x x x的基真标签空间。第二项是OOD检测器,用于确定 x x x是属于基类空间还是新类空间。第一项是对应类空间的分类器。

方程2 促使我们提出一个新的分解提示调谐框架(DEPT),它协同利用了零样本基线ZS和提示调谐方法PT的优点,DEPT框架的预测概率 P D E P T ( y ∣ x ) P_{DEPT}(y|\bm x) PDEPT(yx)为:


其中, P O O D ( y ∈ Y b ∣ x ) P_{OOD}(y\in \mathcal{Y}_b|\bm x) POOD(yYbx)是OOD检测器,用于确定 x \bm x x属于基类空间还是新类空间。 P Z S ( y ∣ x ) P_{ZS}(y|\bm x) PZS(yx) P P T ( y ∣ x ) P_{PT}(y|\bm x) PPT(yx) Z S ZS ZS P T PT PT的分类器。在接下来的理论分析和实证实验中,我们采用使用MSP方法作为OOD检测器的ZS方法,即对于 i ∈ { b , n } , P O O D ( y ∈ Y i ∣ x ) = max y ∈ Y i P Z S ( y = j ∣ x ) i\in \{b,n\},P_{OOD}(y\in \mathcal{Y}_i|\bm x)=\underset{y\in \mathcal{Y}_i}{\text{max}}P_{ZS}(y=j|\bm x) i{b,n},POOD(yYix)=yYimaxPZS(y=jx)

然后,我们采用两个概率分布 p \bm p p q \bm q q的交叉熵度量,即 H ( p , q ) = − ∑ i = 1 C p i log q i H(\bm p,\bm q)=-\sum^C_{i=1}{p_i \text{ log}q_i} H(p,q)=i=1Cpi logqi,来评估 P Z S ( y ∣ x ) P_{ZS}(y|\bm x) PZS(yx)和我们的DEPT框架 P D E P T ( y ∣ x ) P_{DEPT}(y|\bm x) PDEPT(yx)的性能。我们表示分布 k ~ = { I [ k = b ] , I [ k = n ] } \tilde{\bm k}=\{\mathbb{I}[k=\bm b],\mathbb{I}[k=\bm n]\} k~={I[k=b],I[k=n]} y ~ = { [ f ( x ) = i ] } i = 1 C \tilde{\bm y}=\{[f(x)=i]\}^C_{i=1} y~={[f(x)=i]}i=1C对于 x x x。最后,我们表示以下交叉熵值为零基线,提示调优方法和DEPT框架:

定理2.1。如果 E x [ H Z s C L S ( x ) ] ≤ δ \mathbb{E}_x[H_{Zs}^{CLS}(\bm x)] \le \delta Ex[HZsCLS(x)]δ对于 x \bm x x既属于基类又属于新类, E x [ H P T C L S ( x ) ] ≤ δ − Δ \mathbb{E}_x[H_{PT}^{CLS}(\bm x)] \le \delta -\Delta Ex[HPTCLS(x)]δΔ对于 x \bm x x属于基类, E x [ H Z S C L S ( x ) ] ≤ ϵ \mathbb{E}_x[H_{ZS}^{CLS}(\bm x)] \le \epsilon Ex[HZSCLS(x)]ϵ,给定测试数据中基类和新类的均匀混合比 ( α : 1 − α ) (\alpha:1-\alpha) (α:1α),我们可以确定:


说明 2.2。定理2.1表明,将零样本基线分解为OOD检测器和分类器,并结合提示调优方法辅助基类分类,可以有效降低分类误差的上界。此外,增强OOD检测器的可靠性有助于减少误差项,并确保与基线方法相比,新类的性能保持不变。因此,该框架保留了ZS方法的基到新可判别性和新类可判别性。此外,PT方法的细化增加了 Δ \Delta Δ,进一步增强了基类的可分辨性,降低了误差的上界。

定理2.1激励我们设计一种基于方程3的鲁棒提示调谐方法,使用OOD检测技术来求解OPT。

3. DECOOP方法

我们提出了一个新的提示调整框架,称为DEPT,以解决OPT问题。DEPT框架有效地维护了基类和新类之间的可分辨性,从而在应用提示调优时防止了可分辨性的退化。我们的理论分析,如定理2.1所示,证明了DEPT在结合零样本基线和提示调谐方法时的优越性。然而,为了在复杂的实际应用中进一步提高性能,仍然需要解决两个挑战:(1)我们如何训练可靠的OOD检测器来使用来自基类的有限标记数据来识别新类数据?(2)有了可靠的OOD检测器,如何分别提高基类和新类的可分辨性?

为了解决上述挑战,我们基于DEPT框架提出了一种新的提示调优方法,称为分解上下文优化(DECOOP),该方法包含 K K K个新类检测器 { M D i } i = 1 K \{\mathcal M^i_D\}^K_{i=1} {MDi}i=1K和子分类器 { M C i } i = 1 K \{\mathcal M^i_C\}^K_{i=1} {MCi}i=1K新类检测器的引入有助于改进OPT问题中来自新类的数据检测,在OPT问题中,新类的名称是已知的,并且可以被利用。这与传统的OOD检测问题不同,为进一步提高性能提供了机会。子分类器的设计是为了更好地从基类中对数据进行分类,并降低新类的潜在风险,目的是通过可靠的基类到新类的可判别性来增强基类和新类的可判别性。DECOOP方法的总体示例如图5所示,下面的小节将详细描述每个组件。

图5。DECOOP方法的整体说明。

3.1. 新型探测器 M D \mathcal M_D MD

在OPT问题中,模型使用 Y b \mathcal{Y}_b Yb进行训练,但在测试过程中具有整个类空间 Y \mathcal{Y} Y的知识。因此,新类检测器的主要挑战是训练模型有效地利用新类 Y n \mathcal{Y}_n Yn的知识,这些知识仅在测试期间已知。

具体来说,我们提出的解决方案包含了一种留出策略,该策略在训练阶段将基类空间 Y b \mathcal{Y}_b Yb划分为两个不同的子集:模拟基类 Y ^ b \mathcal{\hat Y}_b Y^b和模拟新类 Y ^ n \mathcal{\hat Y}_n Y^n,其中 Y ^ b ∪ Y ^ n = Y b \mathcal{\hat Y}_b \cup \mathcal{\hat Y}_n=\mathcal{Y}_b Y^bY^n=Yb。我们分别将原始训练集 D \mathcal{D} D分割为 D b = { ( x , y ) ∣ ( x , y ) ∼ D ∧ y ∈ Y ^ b } \mathcal{D}_b=\{(\bm x,y)|(\bm x,y)\sim \mathcal{D}\wedge y \in \mathcal{\hat Y}_b\} Db={(x,y)(x,y)DyY^b} D n = { ( x , y ) ∣ ( x , y ) ∼ D ∧ y ∈ Y ^ n } \mathcal{D}_n=\{(\bm x,y)|(\bm x,y)\sim \mathcal{D}\wedge y \in \mathcal{\hat Y}_n\} Dn={(x,y)(x,y)DyY^n}。那么,我们对新型检测器的优化目标函数定义为:

其中, l C E ( x , y ) = − log  P ( x ) y l_{CE}(\bm x,y)=-\text{log }{P(\bm x)}_y lCE(x,y)=log P(x)y表示交叉熵损失, l E ( x ) = − ∑ i = 1 C P ( x ) i log  P ( x ) i l_{E}(\bm x)=-\sum^C_{i=1}{P(\bm x)}_i \text{log } {P(\bm x)}_i lE(x)=i=1CP(x)ilog P(x)i表示熵损失, l E b = 1 ∣ D b ∣ ∑ ( x , y ) ∼ D b l E ( x ) l_{E}^b=\frac{1}{|\mathcal{D}_b|}\sum_{(x,y)\sim \mathcal{D}_b}l_{E}(\bm x) lEb=Db1(x,y)DblE(x)表示模拟基类上的平均熵, l E n = 1 ∣ D n ∣ ∑ ( x , y ) ∼ D n l E ( x ) l_{E}^n=\frac{1}{|\mathcal{D}_n|}\sum_{(x,y)\sim \mathcal{D}_n}l_{E}(\bm x) lEn=Dn1(x,y)DnlE(x)表示模拟新类上的平均熵。此外, γ \gamma γ是一个超参数,它控制着 l e b l^b_e leb l e n l^n_e len之间的余量,以确保稳定的优化。方程6中的目标函数鼓励模型对模拟的基类进行低熵预测,对模拟的新类进行高熵预测,从而增强基到新的可判别性。然而,划分基类空间会导致模型的认知仅限于基类的一个子集,从而导致在测试期间无法区分其他基类和新类。为了解决这个问题,我们建议采用 K K K个新类检测器 { M D i } i = 1 K \{\mathcal M_D^i\}^K_{i=1} {MDi}i=1K的集合,在训练期间覆盖整个基类空间。每个新类检测器都用方程6进行训练,并使用不同的类划分。我们的 K K K个新类检测器的类分区确保每个基类被视为至少一个新类检测器的模拟新类。我们将 M D i ( x ) \mathcal M_D^i(\bm x) MDi(x)表示为 x \bm x x计算的新类分数。分数越低表示 x \bm x x属于新类的可能性越高

此外,即使提供了训练有素的新类检测器,阈值对于检测新类仍然至关重要。利用我们的分割和集成策略的优势,我们可以使用Otsu算法在训练期间直接估计每个新类检测器的阈值(Otsu, 1979;Liu & Yu, 2009)和训练数据。这是可行的,因为每个新类检测器的训练数据中存在自然模拟的基类和新类。随后,这些估计的阈值可以平均,以确定阈值,记为 τ \tau τ,用于测试。

3.2. Sub-Classifier M C \mathcal M_C MC

在训练了可靠的新类检测器之后,我们继续为每个检测器训练子分类器,因为每个检测器关注基类空间的特定子集。 K K K个子分类器中的每一个,记为 { M C i } i = 1 K \{\mathcal M^i_C\}^K_{i=1} {MCi}i=1K,被设计为专门化一个特定的基类空间,从而对相应的子集类空间实现更好的可判别性。对于第 i i i个子分类器 M C i \mathcal M^i_C MCi,我们首先利用训练好的新类检测器 M D i \mathcal M^i_D MDi将训练数据划分为两个子集: D b i \mathcal{D}_b^i Dbi D n i \mathcal{D}_n^i Dni。在这里, D b i = { ( x , y ) ∣ ( x , y ) ∼ D ∧ M D i ( x ) ≥ τ } \mathcal{D}^i_b=\{(\bm x,y)|(\bm x,y)\sim \mathcal{D}\wedge \mathcal M^i_D(\bm x) \ge \tau\} Dbi={(x,y)(x,y)DMDi(x)τ} D n i = { ( x , y ) ∣ ( x , y ) ∼ D ∧ M D i ( x ) < τ } \mathcal{D}^i_n=\{(\bm x,y)|(\bm x,y)\sim \mathcal{D}\wedge \mathcal M^i_D (\bm x) < \tau\} Dni={(x,y)(x,y)DMDi(x)<τ}。随后,我们优化如下目标函数:

其中, l K L l_{KL} lKL表示KL-散度损失, P ( x ) P(\bm x) P(x) P Z S ( x ) PZS(\bm x) PZS(x)表示DECOOP方法和零样本CLIP基线的预测概率。我们将 M C i ( x ) \mathcal M^i_C(\bm x) MCi(x)表示为 x \bm x x计算的预测概率。

3.3. 推理

在测试过程中,我们评估了 K K K个新类检测器 { M D i } i = 1 K \{\mathcal M^i_D\}^K_{i=1} {MDi}i=1K的集合,以确定每个测试数据是否应该由一个学习的子分类器 M C i \mathcal M^i_C MCi或零样本CLIP基线预测。具体来说,对于一个测试实例 x \bm x x,我们首先计算新类探测器的得分,

其中 i ∗ = arg max i ∈ { 1 , … , K } M D i ( x ) i^*=\text{arg max}_{i\in \{1,\ldots,K\}}{\mathcal M^i_D(\bm x)} i=arg maxi{1,,K}MDi(x)(me:总感觉这个公式是 i ∗ = arg max i ∈ { 1 , … , K } M C i ( x ) i^*=\text{arg max}_{i\in \{1,\ldots,K\}}{\mathcal M^i_C(\bm x)} i=arg maxi{1,,K}MCi(x))。DECOOP方法选择单个子分类器来预测每个测试数据,而不是将所有子分类器的结果聚合在一起。因此,与零样本CLIP基线相比,我们的方法需要对新型探测器进行 K K K倍的计算。在我们的实验中,我们将 K K K设置为3,这不会带来沉重的计算负担。我们在附录B.7中进行了评估时间的实验,证明了DECOOP是相对高效的。

4. 实验

表3。使用ViT-B/16架构的11个数据集的性能比较。最好的表现是用粗体。

表4。使用MSP方法(Hendrycks & Gimpel, 2016)和AUROC指标评估每种方法的从基到新可辨别性。最好的表现是用粗体。

6. 结论

在本文中,我们详细探讨了OPT问题,并揭示了基础到新识别性是至关重要的,但往往被现有的方法和设置所忽视。我们首先引入DEPT框架,并通过理论分析证明,将OOD检测纳入提示调谐可以增强基到新类的可分辨性,防止新类的可分辨性退化。在DEPT的基础上,我们提出了一种新的提示调优方法,称为DECOOP,它引入了新的类检测器和子分类器,以进一步增强基类和新类的可辨别性。实验结果验证了我们对DEPT的分析,并证明了我们的DECOOP方法的有效性。

参考资料

论文下载(ICML 2024)

https://arxiv.org/abs/2406.00345

代码地址

https://github.com/WNJXYK/DeCoOp

相关文章:

DeCoOp: Robust Prompt Tuning with Out-of-Distribution Detection

文章汇总 me&#xff1a;看得很迷糊 新型检测器 M D \mathcal M_D MD​的训练是为了对一个子基类去划分子基类中的base和new。 在获得每个子基类之后&#xff0c;为每个检测器训练子分类器 M C \mathcal M_C MC​ 在推理时&#xff0c;如果最高得分的检测器 M D i ( x ) \ma…...

Tinker热修复框架详解:Android应用补丁生成,提升应用稳定性

Tinker 是腾讯开源的Android热修复框架&#xff0c;通过动态更新和修复应用中的代码、资源和本地库文件&#xff0c;无需用户重新安装 APK&#xff0c;便可以及时修复应用中的 bug&#xff0c;优化用户体验。 下面是Tinker在Android项目中的详细用法&#xff0c;结合Kotlin 代…...

手写—— netty 实现 rabbitMq客户端

要使用 Netty 实现一个 RabbitMQ 客户端&#xff0c;你可以将 RabbitMQ 协议封装在 Netty 中&#xff0c;通过自定义编码和解码来实现与 RabbitMQ 的通信。RabbitMQ 使用 AMQP (Advanced Message Queuing Protocol) 协议&#xff0c;因此我们需要创建合适的协议封装和处理逻辑。…...

调用高德地图天气查询api

之前使用的api一直用不了&#xff0c;才发现web端类型的没有天气查询功能 web服务才有 然后在linux的环境变量中配置一下 发现linux中配的环境变量不行&#xff0c;于是给输入amap_weather给的字典明文token。 # 选用RolePlay 配置agent from modelscope_agent.agents.role_p…...

【Vulkan入门】03-创建Device

目录 先叨叨git信息关键代码VulkanEnv::CreateDevice() 编译并运行程序题外话 先叨叨 在上篇已经选择了一个合适的PhysicalDevice。 本篇要为这个PhysicalDevice创将一个Device。Device可以理解为APP与PhysicalDevice之间的代理。 所有APP与PhysicalDevice之间交互的资源都通过…...

【Axios】如何在Vue中使用Axios请求拦截器

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…...

query did not return a unique result: 2;

文章目录 错误原因分析关键位置可能原因解决方法1. 检查数据库数据2. 修改查询方法3. 限定查询返回唯一结果4. 检查业务逻辑 总结 1、LoginLogRepository2、LoginLogService3、LoginLogApiService4、MyAuthenticationSuccessHandler 微信小程序开发者工具控制台报错 {"tim…...

PHP升级

PHP升级CentOs8 wget http://rpms.famillecollet.com/enterprise/remi-release-8.rpm rpm -ivh remi-release-8.rpm --nodeps --force rpm -qa | grep remi dnf module list php dnf module enable php:remi-7.4首先&#xff0c;重置当前的 PHP 模块&#xff0c;以便清理所有已…...

C++设计模式(原型、代理、适配器、组合)

一、原型模式 1.定义 用原型实例指定创建对象的种类&#xff0c;并且通过拷贝这些原型创建新的对象。 原型模式允许通过复制现有的对象来创建新对象&#xff0c;而不是通过实例化类来创建。这种方式可以避免创建重复的对象&#xff0c;从而提高性能和降低内存消耗。 2.组成 …...

超详细搭建PhpStorm+PhpStudy开发环境

刚开始接触PHP开发&#xff0c;搭建开发环境是第一步&#xff0c;网上下载PhpStorm和PhpStudy软件&#xff0c;怎样安装和激活就不详细说了&#xff0c;我们重点来看一看怎样搭配这两个开发环境。 前提&#xff1a;现在假设你已经安装完PhpStorm和PhpStudy软件。 我的PhpStor…...

Axure RP在智慧农场可视化大屏系统设计中的应用

随着科技的飞速发展&#xff0c;智慧农业已成为现代农业的重要发展方向。智慧农场可视化大屏系统作为智慧农业的重要组成部分&#xff0c;正逐步成为农场管理、决策和展示的核心工具。Axure RP&#xff0c;作为一款强大的原型设计工具&#xff0c;其在智慧农场可视化大屏系统的…...

《嵌入式硬件设计》

一、引言 嵌入式系统在现代科技中占据着至关重要的地位&#xff0c;广泛应用于消费电子、工业控制、汽车电子、医疗设备等众多领域。嵌入式硬件设计作为嵌入式系统开发的基础&#xff0c;直接决定了系统的性能、可靠性和成本。本文将深入探讨嵌入式硬件设计的各个方面&#xff…...

【C语言篇】C 语言总复习(上):点亮编程思维,穿越代码的浩瀚星河

我的个人主页 我的专栏&#xff1a;C语言&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01;点赞❤ 收藏❤ 在计算机科学的广袤宇宙中&#xff0c;C语言犹如一颗璀璨的恒星&#xff0c;散发着持久而耀眼的光芒。它作为一种基础且强大的编程语言&#xff0c;承载…...

多线程——04

本节目标 1. wait 和 notify 方法 2. 代码案例 1. wait 和 notify 方法 1. 方法使用 多个线程的执行顺序本身是随机的&#xff08;抢占式执行&#xff09; wait —— 让指定线程进入阻塞状态 notify —— 唤醒对应的阻塞状态的线程 注意&#xff1a; wait, notify, notifyAl…...

使用ECS和OSS搭建个人网盘

在linux服务器 一、下载cloudreve安装包。 执行如下命令&#xff0c;下载cloudreve安装包。 wget https://labfileapp.oss-cn-hangzhou.aliyuncs.com/cloudreve_3.3.1_linux_amd64.tar.gz 下载完毕后&#xff0c;执行如下命令&#xff0c;解压cloudreve安装包。 tar -zxvf c…...

Android 单元测试断言校验方法 org.junit.Assert

判断布尔值 assertTrue assertFalse 判断对象非空 assertNull(object); 案例&#xff1a; PersistableBundle result Util.getCarrierConfig(mockContext, subId);assertNull(result); 判断是否相等 assertEquals("mocked_string", result.toString()); package or…...

SpringSecurity学习

介绍 SpringSecurity是一个作用于身份认证和权限控制的框架&#xff0c;其针对的主要就是网站的安全问题 页面代码 要使用SpringSecurity的前提是有一个可以正常访问业务逻辑的代码&#xff0c;再使用SpringSecurity实现权限控制和身份验证。 后端代码 package com.learn.…...

Eureka和Zookeeper、Nacos的区别

目录 一、Eureka与Zookeeper的区别 适用场景&#xff1a; 架构设计&#xff1a; 功能特性&#xff1a; 社区生态&#xff1a; 二、Eureka与Nacos的区别 接口方式&#xff1a; 实例类型&#xff1a; 健康检测&#xff1a; 服务发现&#xff1a; 一致性与可用性&#…...

基于gitlab API刷新MR的commit的指定status

场景介绍 自己部署的gitlab Jenkins,并已经设置好联动(如何设置可以在网上很容易搜到)每个MergeRequest都可以触发多个Jenkins pipeline&#xff0c;pipeline结束后会将状态更新到gitlab这个MR上希望可以跳过pipeline运行&#xff0c;直接将指定的MR的指定pipeline状态刷新为…...

SpringBoot | 拦截器 | 统一数据返回格式 | 统一异常处理 | 适配器模式

拦截器 拦截器是Spring框架提供的核心功能之一, 主要用来拦截用户的请求, 在指定方法前后, 根据业务需要执行预先设定的代码. 也就是说, 允许开发人员提前预定义一些逻辑, 在用户的请求响应前后执行. 也可以在用户请求前阻止其执行. 在拦截器当中&#xff0c;开发人员可以在…...

Oracle清除水位

– 清除水位 ALTER TABLE 数据库名.表名 ENABLE ROW MOVEMENT; ALTER TABLE 数据库名.表名 SHRINK SPACE CASCADE; ALTER TABLE 数据库名.表名 DISABLE ROW MOVEMENT; – 回收统计信息 BEGIN DBMS_STATS.GATHER_TABLE_STATS(OWNNAME > ‘数据库名’, TABNAME > ‘表名’…...

软件工程——期末复习(2)

Part1&#xff1a;软件工程基本概念 软件程序文档数据 在软件工程中&#xff0c;软件通常被定为程序、文档和数据的集合。程序是按事先设计的功能和性能要求编写的指令序列&#xff1b;程序是完成指定功能的一段特定语言代码。文档是描述程序操作和使用的文档&#xff0c;是与…...

RAID1技术是什么?它的发展和工作原理如何?

RIAD1是一种先进的数据存储与冗余技术&#xff0c;设计用于解决现代分布式系统中常见的数据安全、数据一致性和高可用性等问题。随着云计算和大规模分布式存储系统的兴起&#xff0c;如何保障数据在高效传输与存储过程中仍然能具备足够的安全性和可靠性&#xff0c;成为了各大企…...

【Apache Paimon】-- 8 -- flink 创建 paimon connecor 的两种方式

目录 1、使用 catalog 创建非临时表 2、使用 with 创建 temporary 表 3、对比 4、参考 1、使用 catalog 创建非临时表 CREATE CATALOG my_catalog WITH (type = paimon,warehouse = hdfs:///path/to/warehouse );USE CATALOG my_catalog; CREATE TABLE `<your-paimon-…...

js进阶-关于运算符++

一、运算符与表达式 运算符按参与的运算单元数量分为&#xff1a;一元运算符、二元运算符和三元运算符&#xff1b;表达式是运算单元和运算符一起构成的&#xff1b;每个表达式都有一个运算后的返回值。 二、关于运算符 1.概述 运算符分为两部分&#xff0c;第一部分是返回运…...

三维地图,智慧城市,商业智能BI,数据可视化大屏(Cesiumjs/UE)

绘图工具 三维地图&#xff1a;Cesiumjs 建模方式&#xff1a;激光点云建模、航拍倾斜摄影建模、GIS建模、BIM建模、手工建模 建模工具&#xff1a;C4D Blender GeoBuilding ArcGIS Cesiumjs <!DOCTYPE html> <html lang"en"> <head><meta …...

通过EPEL 仓库,在 CentOS 7 上安装 OpenResty

通过EPEL 仓库&#xff0c;在 CentOS 7 上安装 OpenResty 通过EPEL 仓库&#xff0c;在 CentOS 7 上安装 OpenResty步骤 1: 安装 EPEL 仓库步骤 2: 安装 OpenResty步骤 3: 启动 OpenResty步骤 4: 设置开机自启步骤 5: 验证安装说明 通过EPEL 仓库&#xff0c;在 CentOS 7 上安装…...

每日一题 LCR 054. 把二叉搜索树转换为累加树

LCR 054. 把二叉搜索树转换为累加树 使用后序遍历即可 class Solution { public:TreeNode* convertBST(TreeNode* root) {int temp 0;dfs(root,temp);return root;}void dfs(TreeNode* root,int &temp){if(!root){return ;}dfs(root->right,temp);temp root->val;…...

【贪心算法】贪心算法五

贪心算法五 1.跳跃游戏 II2.跳跃游戏3.加油站3.单调递增的数字 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f603; 1.跳跃游戏 II 题目链接&…...

vue2播放视频和预览文件的组件以及使用方法

##文件预览组件 按照组件 解决展示pdf的问题 npm install pdfh5 npm install canvas2.8.0 --ignore-scripts npm install --save dommatrix npm install --save web-streams-polyfill解决excel和docx预览的问题 npm install vue-office/docx vue-demi0.14.6 npm inst…...

记录一下,解决js内存溢出npm ERR! code ELIFECYCLEnpm ERR! errno 134 以及 errno 9009

项目是个老项目&#xff0c;依赖包也比较大&#xff0c;咱就按正常流程走一遍来详细解决这个问题&#xff0c;先看一下node版本&#xff0c;我用的是nvm管理的&#xff0c;详细可以看我的其他文章 友情提醒&#xff1a;如果项目比较老&#xff0c;包又大&#xff0c;又有一些需…...

【批处理脚本】更改Windows系统中的 hosts 解析文件

概述 作用 修改 Windows 系统中的 hosts 文件&#xff0c;可以实现 插入 或 删除 条目。该脚本允许用户以管理员权限执行&#xff0c;将特定的域名解析到指定的 IP 地址 应用场景 非常适用于需要频繁或批量修改 hosts 文件的场景&#xff1a; 屏蔽网站、域名重定向、DNS 污染防…...

AIGC 与艺术创作:变革与机遇

在当今数字化时代&#xff0c;人工智能生成内容&#xff08;AIGC&#xff09;正以惊人的速度重塑着艺术创作的格局&#xff0c;为艺术家们带来了令人振奋的新机遇。 一.AIGC 的崛起与艺术领域的变革 随着人工智能技术的不断进步&#xff0c;AIGC 逐渐在艺术领域崭露头角。它依…...

String IP和Int IP的互相转换

android中&#xff0c;wifiManager.connectionInfo.ipAddress 可以获取到wifi的ip地址&#xff0c;但这是一个int值&#xff0c;如何转换为常见的如192.168.1.129这种形式&#xff0c;以及这种形式如何转换回int值的形式。 这里ip分为4段&#xff0c;每一段的值都是0 ~ 255&am…...

【大数据学习 | 面经】yarn的资源申请和分配的单位-Container

在yarn中&#xff0c;资源的申请和分配是以container为单位进行的&#xff0c;而不是直接以application和task为单位。 每个提交到yarn上的应用程序&#xff08;application&#xff09;都有一个对应的ApplicationMaster&#xff08;AM&#xff09;。这个AM负责与ResourceMana…...

php基础:文件处理2

1.文件属性 当我们在程序中操作文件时&#xff0c;可能会使用到文件的一些常见属性&#xff0c;比如文件的大小、类型、修改时间、访问时间以及权限等等。PHP 中提供了非常全面的用来获取这些属性的内置函数&#xff0c;如下表所示。 2.目录操作 新建目录&#xff1a;mkdir(路…...

gradle下载慢解决方案2024 /12 /1android studio (Windows环境)

gradle下载慢解决方案2024 /12 /1 默认环境配置好了,环境配置和程序安装请出门右转 打开软件,点击右上角设置,找到如下设置页 选择本地安装并制定好你已经安装好的 gradle 应用保存即可 全局插件环境配置(新版本可以直接在设置中添加了) 找对应位置添加国内源并把前面的内置源…...

使用Java将PDF文件解析成Excel文件

安装pom依赖 <!-- 解析pdf--><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.27</version> <!-- 请检查并使用最新版本 --></dependency>测试读取pdf文件…...

怎么区分直线模组中的导程和行程?

直线模组是一种直线传动装置&#xff0c;安装方便&#xff0c;精度高&#xff0c;其使用范围广。直线模组中的导程和行程是两个不同的概念&#xff0c;它们分别描述了直线模组的不同性能参数。 直线模组的行程指的是模组能够正常移动的最大距离&#xff0c;即滑块预期移动的有效…...

算法日记 42 day 图论

今天来看看广度优先搜索&#xff0c;并且写几个题。刷到这里我才想起来&#xff0c;当时第一次面试的时候问的就是这个题&#xff0c;当时大概知道一点思路&#xff0c;但不清楚是图论方面的&#xff0c;更别说写出来了。 广度优先搜索&#xff08;BFS&#xff09; 不同于深度…...

STM32 GPIO 8种工作模式的应用场景

目录 一、四种输入模式1、模拟输入&#xff1a;2、浮空输入&#xff1a;3、上拉输入&#xff1a;4、下拉输入&#xff1a; 二、四种输出模式1、推挽输出&#xff1a;2、开漏输出&#xff1a;3、复用推挽输出&#xff1a;4、复用开漏输出&#xff1a; 一、四种输入模式 1、模拟…...

JVM 类加载器有哪些?双亲委派机制的作用是什么?如何自定义类加载器?

类加载器分类 大家好&#xff0c;我是码哥&#xff0c;可以叫我靓仔&#xff0c;《Redis 高手心法》畅销书作者。 先回顾下&#xff0c;在 Java 中&#xff0c;类的初始化分为几个阶段: 加载、链接&#xff08;包括验证、准备和解析&#xff09;和 初始化。 而 类加载器&#x…...

揭秘:短视频矩阵源码功能开发分析!!!

一、短视频矩阵系统源码概述 短视频矩阵系统源码旨在为内容创作者及企业提供一种高效的工具&#xff0c;以实现对多个短视频账户的一站式管理。该系统支持同时管理、发布、监控和优化多达1000个短视频账户&#xff0c;显著提升了操作效率。 二、主要功能 1. 多账号管理 该系…...

leetcode - 2337. Move Pieces to Obtain a String

Description You are given two strings start and target, both of length n. Each string consists only of the characters ‘L’, ‘R’, and ‘_’ where: The characters ‘L’ and ‘R’ represent pieces, where a piece ‘L’ can move to the left only if there i…...

第九篇:k8s 通过helm发布应用

什么是helm&#xff1f; Helm 是 Kubernetes 的包管理器。Helm 是查找、分享和使用软件构建 Kubernetes 的最优方式。 在红帽系的Linux中我们使用yum来管理RPM包&#xff0c;类似的&#xff0c;在K8s中我们可以使用helm来管理资源对象&#xff08;Deployment、Service、Ingress…...

MySQL:锁机制

锁是计算机协调多个进程或线程并发访问某一资源的机制&#xff08;避免争抢&#xff09;。 在数据库中&#xff0c;除传统的计算资源&#xff08;如 CPU、RAM、I/O 等&#xff09;的争用以外&#xff0c;数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效…...

在lio_sam中融入GPS

文章目录 概要GPS里程计GPS因子反算后的GPS里程计概要 在LIO(激光惯性里程计)系统中,将GPS信息融合到里程计中,借助GTSAM(Georgia Tech Smoothing and Mapping)库进行因子图优化,可以有效提升全局定位精度。 GPS里程计 利用GeographicLib第三方库将经纬度投影到局部笛…...

快速构建NLP理论知识体系

NLP理论知识体系 一句话解释NLPNLP模型及原理简述1、Rag 一句话解释NLP 如果我们要实现机器翻译、情感分析、问答系统、文本摘要、聊天机器人、构造智能化的辅助文件填写模板&#xff0c;NLP可以通过现成的模型对输入的语音、文字、图片进行处理&#xff08;分词、标词性、去停…...

长期稳定境外号码解决方案:内地用户如何打电话、接收短信和验证码

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 三大方案对比 📒📝 免费且稳定的境外号码📝 长期稳定且符合本地政策📝 适合低频使用者⚓️ 相关链接 ⚓️📖 介绍 📖 许多用户在日常生活中需要拨打境外电话、接收短信或验证码,尤其是跨境电商从业者,更是对境外号…...

SpringCloud 与 SpringBoot版本对应关系,以及maven,jdk

目录 SpringCloud 与 SpringBoot各版本的对应关系 方式一 Learn 方式二 OverView SpringBoot与JDK、maven 容器等对应关系 SpringCloud 与 SpringBoot各版本的对应关系 SpringCloudSpringBootFinchley2.0.xFinchley.SR1Spring Boot >=2.0.3.RELEASE and <=2.0.9RELEAS…...