对比学习做了什么?

2023-11-11

什么是对比学习?

对比学习貌似处于“无明确定义、有指导原则”的状态

什么是对比学习呢?(这个是微信链接)全文比较长,但是逻辑框架还是不错的。

如果想要更快速的了解什么是对比学习或者说对比学习是怎么做的,可以看SimCLR这个模型文章,该文章可以说介绍了比较“标准”的对比学习模型,这篇文章对SimCLR进行了图解,讲得很好。

那么对比学习的统一表示是什么呢,或者说对比学习的统一框架是什么呢?这篇文章做了很好的解释。

就目前来说,对比学习学习的框架可以总结为三种:

  1. 基于负例的:

    • 主要以SimCLR为代表,虽然在SimCLR之前(2020年)已经提出很多对比学习模型,比如Moco V1,但是这篇SimCLR的效果相比于之前的模型,效果明显,而且采用了对称结构,整体相对比较清晰,容易说清楚。
  2. 基于非对称网络的

  3. 基于特征去相关(或者冗余消除损失函数方法)

前言

首先搬出论文的出处:

【文章一】ICML’20Understanding Contrastive Representation Learning through Alignment and Uniformity on the Hypersphere

【文章二】CVPR’21 Understanding the Behaviour of Contrastive Loss

先说一下为什么要读这两篇论文呢?其实是来自一个偶然的机会,自己看到了对比学习(Contrastive Learning)这个东西,还是从ConSERT: A Contrastive Framework for Self-Supervised Sentence Representation Transfer这篇文章入坑的(当然作为对比学习的入门,感觉还是SimCLR这个论文比较直白)。然后就想知道为什么对比学习有点形而上了,感觉是这么回事,但是觉得缺少了证明,为此无意中发现了这两篇文章。

感觉【文章二】是一定程度上Follow了【文章一】的工作,两篇文章都是从数学的角度上来证明为何Contrastive Learning 可以work。

背景

对比学习的思想说起来很简单,即拉近相似的样本,推开不相似的样本,一种常用的对比损失是基于批内负样本的交叉熵损失,假设我们有一个数据集 D = { ( x i , x i + ) } i = 1 m D = \{(x_i,x_i^+)\}^m_{i=1} D={(xi,xi+)}i=1m,其中 x i x_i xi x i + x_i^+ xi+是语义相关的,则在大小为N的mini batch内, ( x i , x i + ) (x_i, x_i^+) (xi,xi+)的训练目标为
ι i = l o g e s i m ( h i , h i + ) / τ ∑ j = 1 N e s i m ( h i , h j + ) / τ \iota_i = log\frac{e^{sim(h_i,h_i^+)/\tau}}{\sum^N_{j=1}e^{sim(h_i,h_j^+)/\tau}} ιi=logj=1Nesim(hi,hj+)/τesim(hi,hi+)/τ
但是对比学习中,最重要的就是要去构造Postive instances ( x i , x i + ) (x_i,x_i^+) (xi,xi+),对比学习最早起源于CV领域的原因之一就是图像是可以通过旋转、裁剪、扭曲等方式构造出不影响对图像语义理解的正样本 x i + x_i^+ xi+。近期也是有很多在NLP领域的数据增强的方法应用于产生正样本的方法。

Contrastive loss

【文章一】中说到,常见的contrastive loss如下图所示:

image-20211229195532089

其中:

  • p o s ( x , y ) pos(x,y) pos(x,y)表示一个正样本对;
  • x i − x_i^- xi表示 x i x_i xi的负样本;
  • f ( x ) f(x) f(x)是一个trained encoder(以目前我的理解来看,我觉得就是神经网络);

有点抽象,那么我们看SimCLR和CoonSERT两篇论文中使用的Loss来进行对比,便于理解:image-20211229200127546

至于是怎么计算的,这篇博客一SimCLR为切入点来介绍了整个过程,在我看来,分子就是positive pair,也就是只考虑正样本对的距离,然而分母就是所有的距离了,包括正样本对和负样本对。

当然还有其他的对比学习中使用的Loss:

image-20211229204241930

正文(文章一)

两个属性

首先【文章一】中确定了与对比损失有关的两个属性:

  1. Alignment用来衡量正例对样本间的近似程度(紧密型或对齐性),即相似的样本具有相似的特征。
  2. Uniformity评估所有数据的向量均匀分布的程度,越均匀,保留的信息越多
image-20211230160541607

让特征分布在unit hypersphere的好处是?

  1. 固定范数的向量提升训练的稳定性;

  2. 如果一个类别的特征能被比较好的聚类,那么在整个特征空间上这个类别是更容易被线性可分的。

    image-20211230160328465

对于这个线性可分,文中做了实验:用AlexNet为模型框架,在CIFAR-10上,对比了三种实验方法:随机初始化、监督分类学习和无监督对比学习,可视化了表征效果(我感觉文中还是因为二维的可以更好地显示表达,因此才采取了二维圆的方式,尽管文中一直在说超球面这个概念,但是这个超球面的维度m一般也是大于2的):

image-20211230161500705

我们来简单的分析上图:

  • 首先是Alignment这个柱状图,可以看出,正例样本对是都很相近的,效果也都还不错;
  • 再看Uniformity这个图,三种方法中,最差劲的当然是随机初始化的了,这也侧面反映出为什么正例样本对为什么都很近——因为所有的样本都堆在一起了,那么根据Uniformity的定义可知,这样的特征信息不能均匀分布在Hyperspher上,因此信息机会保留不了。
  • 我们再看最右边的四张图,可以发现,对比学习的不同类别的表征是分布在圆的不同位置上的(看圆形图下面的Angles分布图)。
    • 相比于监督学习来说,对比学习的分布就更均匀,不会出现聚集的现象——虽然线性分割的效果,对比学习(28.60%)比监督学习(58.19%)来说差了很多,但是保留了更多的信息可以学习。

衡量两个属性

我们再回过头来看一下文中所说的Loss:image-20211229195532089

文中将 L c o n t r a s t i v e L_{contrastive} Lcontrastive进行了拆分,拆分成了两个部分(就是化简):

image-20211230222328531

文中为了衡量Alignment和Uniformity这两个属性,将定义两个loss( L a l i g n 和 L u n i f o r m L_{align}和L_{uniform} LalignLuniform)分别对应这两个属性,如下(从形式上来看,就是将 f ( x i − ) T f ( x ) f(x_i^-)^Tf(x) f(xi)Tf(x)变成了 ∣ ∣ f ( x ) − f ( y ) ∣ ∣ ||f(x)-f(y)|| ∣∣f(x)f(y)∣∣):

image-20211230222514320

image-20211230222534608

我感觉这样做的目的就是:证明对比学习的机制或者说效果好的原因就是因为Alignment和Uniformtiy这两属性,那么文章就干脆根据这两个属性的定义,构造了两个Loss,直接优化这两个Loss就可以得出效果是不是比 L c o n t r a s t i v e L_{contrastive} Lcontrastive更好。如果好,那么就证明了对比学习确实是因为这两个属性才使得效果变好的。

为什么这样写呢,文中是给出了详细的公式推理的,我这里截取了一点点给显示的说明一下等式关系:

image-20211230234124638

实验证明

从下图可以明显看出,直接优化的Loss(在下图中就是小圆点)的acc更高

image-20211230223729052

下面这张图也反应出了 L a l i g n 和 L u n i f o r m L_{align}和L_{uniform} LalignLuniform结合的重要性,不管是单独使用哪一个,效果都不好(我觉得下图的纵坐标只是代表数值,并非是某一个度量,也就是 L a l i g n 和 L u n i f o r m L_{align}和L_{uniform} LalignLuniform都应该越小越好)。

image-20211230232634595

正文(文章二)

首先说明,对比学习中的negative sample应该是相对于anchor simple来说的,也就是说,对于样本 x i x_i xi来说,除了数据增加的 x i + x_i^+ xi+其余的都是负样本。

这也解释了为什么越推远负样本,反而潜在语义效果也差了,因为负样本中是包含同类样本的相似样本,比如在对比学习美短这种猫的同时,如果过分追求unifomty,就会导致推远银渐层这种猫的距离,这样也就破坏了相似样本的潜在语义。这是因为contrastive loss只是追求区分不同的instance(或者说sample),而没有关注语义关系。

摘要

这篇文章主要讨论了对比学习的Loss函数,并认为对比学习的Loss是一个hardness-aware loss function,温度参数 τ \tau τ能够控制对hard negative sample的惩罚程度(越小,惩罚越高,越容易使相似的负样本分开,使其变得均匀,即uniformity)。但是过分的追求uniformity的指标,会破坏相似样本(所谓的相似样本指的是与正样本相似度极高的负样本往往很可能是潜在的正样本)的空间分布,进一步会影响到下游任务。作者称这种现象为uniformity-tolerance dilemma,但是选择一个好的温度系数 τ \tau τ可以很好地平衡分离负样本和容忍相似样本的关系。

介绍

为了更好地理解作者提出的语义结构的影响,作者用下图作解释。对于(a)(b)两种embedding分布而言,我们将 x j 和 x k x_j和x_k xjxk的embedding交换,虽然不会改变对比学习的loss,但是(a)的这种分布相比于(b)的这种分布在下游任务中表现更好,因为它能够体现出样本间潜在的语义结构。

其实这个图也从侧面表示出uniformity-tolerance的特点,(a)图表示出相似样本距离并非很远,但是(b)图的相似样本距离较远(虽然对于 x j x_j xj x k x_k xk来说不用样本的距离是一样的,那么loss也就一样),在下游任务中结果显示,(a)中这样的分布效果更好,也就是说明相似样本之间潜在语义得以保留。

image-20220103211431079

同时文章还探讨了温度对Contrastive loss的影响,发现对于越低的温度,contrsstive loss会更加惩罚最近的负样本,虽然分布的会更加均匀(拉近正样本对的距离,拉开负样本对的距离,这样的方法并不包含语义信息),但是同时也会导致相似样本的分离,作者用T-SNE可视化了不同温度下的embedding的分布情况:

image-20220103214834615


整个文章做了三个工作:

  1. 分析了contrastive loss是一种hardness-aware loss,并且该属性对于contrastive loss意义重大;
  2. 从梯度的角度分析,温度参数是一个惩罚hard negative sample重要的参数;
  3. 表明了在对比学习中确实存在uniformity-tolerance delimma,一个 good choice of temperature可以平衡好uniformity(保证样本分布均匀)和toleartce(保持相似样本的距离)这两个属性。

分析Hardness-aware 属性

首先给出自监督学习广泛使用的对比损失(InfoNCE loss)的形式:

image-20220103220742065

为了表示方便,作者用 P i , j P_{i,j} Pi,j进行了表示(含义为 x i x_i xi被认为是 x j x_j xj的概率):

image-20220103220858800

从对比学习Loss的角度出发(要求第i个样本和它的另一个augmentation的副本(即正样本)之间的相似度 s i , i s_{i,i} si,i尽可能大,而与其他的实例(负样本)之间的相似度 s i , k s_{i,k} si,k尽可能小),作者定义了一个简单的Lossimage-20220103221350079

然而实际训练过程,采用 L s i m p l e L_{simple} Lsimple的方法效果是不如以softmax-based 的 contrastive loss。

这是因为 softmax-based contrastive loss 是 hardness-aware loss function,它能够自动关注negative sample,从而达到均匀分布的效果。

梯度分析

先来看看对于公式(1)的求导情况如下(针对正相似性和付相似性的求偏导数的结果):

image-20220104104502599

根据上式可以得出下面的结论:

  1. 对于negative sample来说,其梯度是正比于 e x p ( s i , j / τ ) exp(s_{i,j}/\tau) exp(si,j/τ),这说明contrasive loss是一种hardness-aware loss function,这是不同于 ∂ L s i m p l e ∂ s i , j = λ \frac{\partial L_{simple}}{\partial s_{i,j}}=\lambda si,jLsimple=λ是呈现出常数比(也就是说对于所有的负样本,梯度都是一样的);
    • 进一步思考,对于所有的负样本比例来说, P i , j P_{i,j} Pi,j的分母项是相同的,那么也就说 s i , j s_{i,j} si,j越大,则 P i , j P_{i,j} Pi,j的分子项就越大,那么梯度也就是越大-------> 也就是说,对比学习的loss是给予了更相似的负样本(hard negative sample)更大的梯度,那么就越远离正样本了
  2. 仔细观察还可以发现一个有意思的地方,那就是正样本的梯度等于所有负样本梯度的和image-20220104110422836

温度的作用

作者对 x j x_j xj这个负样本定义了一个叫做相对惩罚强度:

image-20220104110714910

公式(5)满足满足玻耳兹曼分布,并且该分布的熵随着温度系数的增大严格增大(在论文的补充实验中会给予证明,这里就不阐述了)。

下图展示了负样本相对惩罚与温度和相似度的关系,可以发现,当温度很小的时候,比如0.07,对于距离越近的负样本惩罚越大,那么梯度也就越大,因此越能够远离,反之,随着温度的升高,所有负样本的惩罚呈现均匀性(即呈现出一视同仁的感觉)。

image-20220104113701113


但是这样出现前面所说的问题,过于追求小的温度就会只会惩罚最近的一两个负样本,为此作者从公式的角度考虑了两个极端的例子,即温度趋向于0和无穷大这两种情况。

  • 当温度系数趋向于0时,此时对比损失退化为只关注最困难的负样本的损失函数

image-20220104114640354

  • 当温度系数趋向于无穷大时,此时对比损失对所有负样本的权重都相同,对比损失失去了困难样本关注的特性

    image-20220104114720672

    有趣的是,当温度系数趋向于无穷时,该损失便变成了之前介绍的简单损失 L s i m p l e L_{simple} Lsimple(公式(3))

Explicit Hard Negative Sampling

作者在文中引用了前人Zhuang 等人的工作成果——LocalAggregation。在计算对负样本的梯度的时候,指选择相思对大于某个阈值的负样本来计算Loss(比如选择Top K nearnest negative sample)。

这样的话,相当于放大了负样本的作用,使得当temperature变大时,模型最后形成的embedding分布会更均匀一点,而不会像Figure 4 (下图)那样随着temperature增大embedding分布变得更不均匀,而是和Figure 6的图像一样。

image-20220104135334608

image-20220104142442790

以此缓解Uniformity-Tolerance Dilemma中调节temperature对uniformity变化的影响。

Hard Contrastive Loss定义如下:

image-20220104135646227

其中, s α ( i ) s_{\alpha}^{(i)} sα(i)是负样本与anchor x i x_{i} xi的一个相似度分界点,对于相似度在[ s α ( i ) s_{\alpha}^{(i)} sα(i),1.0]这个区间(informative interval)的负样本被看作是informative hard negative samples与anchor更相似,更难将他们分隔开),而对于相似度在 [-1.0 , s α ( i ) s_{\alpha}^{(i)} sα(i)]这个区间,则被称作uninformative interval。

在计算loss的时候, s i , j < s α ( i ) s_{i,j}<s_{\alpha}^{(i)} si,j<sα(i)的那些负样本,使其 r i ( s i , j ) = 0 r_i(s_{i,j})=0 ri(si,j)=0。相当于将原本负样本的梯度比例分布(如Figure 3)压缩到informative interval的这个区间,从而增强模型对在该区间内负样本的“惩罚”,集中火力把与 x i x_i xi相似的负样本推远。

Uniformity-Tolerance Dilemma

Embedding Uniformity

作者分析了Uniformity和温度的关系,如下图所示:

image-20220104135334608

可以发现,温度越低的时候,contrastive loss往往会分开与anchor sample相近的positive samples这就会导致局部分布更加稀疏


那我们来看看Hard contrastive loss的图像:

image-20220104142442790

可以看出Hard contrastive loss对温度并不那么敏感了,而且效果也保持在一个较高的水平。

Tolerance to Potential Positive Samples

对比学习之后的效果可以用Fig1(a)来表示,但是我们知道随着温度的降低,会导致相近的负样本远离anchor样本,那么为了衡量这样的现象,提出Tolerance这个属性。

作者用下面的式子衡量属于同一类的tolerance:

image-20220104144354958

所谓的同一类就是狗是同一类,但是不管是什么品种,汽车是一个类,也不管是什么品牌。


下图展示了温度对Tolerance的影响:

image-20220104144451218

同样的,我们来看看 L h a r d L_{hard} Lhard的Tolerance的效果:

image-20220104145355727

可以看出,效果还不如ordinary contrative loss,这是肯定的,因为 H h a r d H_{hard} Hhard的unifomity高了,导致相似性下降了。

但是将Figure 6和Figure 4相比可以发现,此时随着temperature增大,Uniformity保持较稳定不变。此时增大temperature便可以在保持uniformity不增大的情况下,增大Tolerance,即模型得到的embedding既保持均匀,又能局部聚集,从而保留一定潜在语义结构,破解上一节所说的Uniformity-Tolerance Dilemma问题。

实验验证

下图展示了在CIFAR100上的效果,结果证明,确实是随着温度的增加,正负样本难以分开(纵坐标代表距离):

image-20220104150841791


另一方面,作者也对不同的数据集的最优温度系数进行了验证,下图绿色的柱子为对比损失随着温度系数的性能表现。此外,作者也验证了采取显式困难样本发现的对比损失,采取了显示的困难样本挖掘算法后,性能表现与温度系数的关联弱化,当温度系数高于一个合适的值时,该损失产生的模型性能基本保持稳定。

image-20220104152403212

总结

文章对对比损失(Contrastive Loss)中的温度系数进行了研究,解释了温度系数的具体作用,借此探索了对比学习的学习机制。

总结下本文的发现:

  1. 对比损失函数是一个具备困难负样本自发现性质的损失函数,这一性质对于学习高质量的自监督表示是至关重要的,不具备这个性质的损失函数会大大恶化自监督学习的性能。关注困难样本的作用就是:对于那些已经远离的样本,不需要继续让其远离,而主要聚焦在如何使没有远离的那些的样本远离,从而使得到的表示空间更均匀(uniformity)。
  2. 温度系数的作用是调节对困难样本的关注程度:越小的温度系数越关注于将本样本和最相似的其他样本分开)。作者对温度系数进行了深入的分析和实验,并利用温度系数来解释对比学习是如何学到有用表征的。
  3. 对比损失存在一个均匀性-容忍性的Dilemma(Uniformity-Tolerance Dilemma)。小温度系数更关注于将与本样本相似的困难样本分开,因此往往可以得到更均匀的表示。然而困难样本往往是与本样本相似程度较高的,例如同一个类别的不同实例,即有很多困难负样本其实是潜在的正样本。过分强迫与困难样本分开会破坏学到的潜在语义结构。

参考:

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对比学习做了什么? 的相关文章

  • 如何删除 PyCharm 中的项目?

    如果我关闭一个项目 然后删除该项目文件夹 则在 PyCharm 重新启动后 会再次创建一个空的项目文件夹 只需按顺序执行以下步骤即可 他们假设您当前在 PyCharm 窗口中打开了该项目 单击 文件 gt 关闭项目 关闭项目 在 PyCha
  • 定义Python源代码编码的正确方法

    PEP 263 http www python org dev peps pep 0263 定义如何声明Python源代码编码 通常 Python 文件的前两行应以以下内容开头 usr bin python coding
  • 尝试从网页Python和BeautifulSoup获取编码

    我试图从网页检索字符集 这会一直改变 目前我使用 beautifulSoup 来解析页面 然后从标题中提取字符集 这工作正常 直到我遇到一个网站 到目前为止 我的代码以及与其他页面一起使用的代码是 def get encoding soup
  • 如何使用 Python boto3 获取 redshift 中的列名称

    我想使用 python boto3 获取 redshift 中的列名称 创建Redshift集群 将数据插入其中 配置的机密管理器 配置 SageMaker 笔记本 打开Jupyter Notebook写入以下代码 import boto3
  • python array(10,1) 和 array(10,) 之间的区别

    我正在尝试将 MNIST 数据集加载到数组中 当我使用 X train y train X test y test mnist load data 我得到一个数组 y test 10000 但我希望它的形状为 10000 1 数组 1000
  • 使用 Pytest 的参数化添加测试功能的描述

    当其中一个测试失败时 可以在测试正在测试的内容的参数化中添加描述 快速了解测试失败的原因 有时您不知道测试失败的原因 您必须查看代码 通过每个测试的描述 您就可以知道 例如 pytest mark parametrize num1 num2
  • OpenCV 跟踪器:模型未在函数 init 中初始化

    在视频的第一帧 我运行一个对象检测器 它返回对象的边界框 如下所示
  • 如何在 Python 中的函数入口、内部和退出处进行日志记录

    我希望能够使用 Python 日志记录工具在我的代码中进行简单且一致的日志记录 我能够执行以下操作 我希望所有现有 未来的模块和函数都有 输入 和 完成 日志消息 我不想添加相同的代码片段来定义日志记录参数 如下所示don t want t
  • python 中的 h2o 框架子集

    如何在 python 中对 h2o 框架进行子集化 如果 x 是一个 df 并且 Origin 是一个变量 那么在 pandas 中我们通常可以通过以下方式进行子集化 x x Origin AAF 但使用 h2o 框架会出现以下错误 H2O
  • 在 Mac OSX 上从 Python 3.6 运行 wine 命令

    我正在尝试用 Python 编写一个打开的脚本wine然后发送代码到wine终端打开一个 exe程序 这 exe程序也是命令驱动的 我可以打开wine 但我无法进一步 import shlex subprocess line usr bin
  • Python“非规范化”unicode 组合字符

    我正在寻找标准化 python 中的一些 unicode 文本 我想知道是否有一种简单的方法可以在 python 中获得组合 unicode 字符的 非规范化 形式 例如如果我有序列u o xaf i e latin small lette
  • PIL.Image.open和tf.image.decode_jpeg返回值的区别

    我使用 PIL Image open 和 tf image decode jpeg 将图像文件解析为数组 但发现PIL Image open 中的像素值与tf image decode jpeg不一样 为什么会出现这种情况 Thanks 代
  • Python 2 的 `exceptions` 模块在 Python3 中丢失了,它的内容到哪里去了?

    一位朋友提到 对于 Python 2 假设您在命令行上的路径环境变量中有它 pydoc exceptions 非常有用 知道它应该可以为他每周节省几分钟的网络查找时间 我自己每周都会用谷歌搜索一次例外层次结构 所以这对我来说也是一个有用的提
  • 为什么这个 if 语句会导致语法错误

    我正在尝试设置一个 elif 语句 如果用户按下 Enter 键 代码将继续 但是我不断遇到语法错误 GTIN 0 while True try GTIN int input input your gtin 8 number if len
  • 将字符串中的随机字符转换为大写

    我尝试随机附加文本字符串 这样就不只是有像这样的输出 gt gt gt david 我最终会得到类似的东西 gt gt gt DaViD gt gt gt dAviD 我现在的代码是这样的 import random import stri
  • Discord.py 嵌入中禁用按钮/冻结按钮

    I m trying to make a replica of this bot in which when I press any of the buttons below it shows a dropdown menu and you
  • 基于值而不是类型的单次调度

    我在 Django 上构建 SPA 并且有一个庞大的功能 其中包含许多功能if用于检查我的对象字段的状态名称的语句 像这样 if self state new do some logic if self state archive do s
  • 非法指令:MacOS High Sierra 上有 4 条指令

    我正在尝试在 pygame 3 6 中制作一个看起来像聊天的窗口 我刚刚将我的 MacBook 更新到版本 10 13 6 在我这样做之前它工作得很好 但在我收到消息之后 非法指令 4 Code import pygame from pyg
  • 如何绘制更大的边界框和仅裁剪边界框文本 Python Opencv

    我正在使用 easyocr 来检测图像中的文本 该方法给出输出边界框 输入图像如下所示 Image 1 Image 2 使用下面的代码获得输出图像 But I want to draw a Single Bigger bounding bo
  • Jupyter Notebook:带有小部件的交互式绘图

    我正在尝试生成一个依赖于小部件的交互式绘图 我遇到的问题是 当我使用滑块更改参数时 会在前一个绘图之后完成一个新绘图 而我预计只有一个绘图会根据参数发生变化 Example from ipywidgets import interact i

随机推荐

  • python 中 sm.graphics.plot_regress_exog 绘制图像的解释

    导入相关包 import numpy as np import pandas as pd import statsmodels api as sm import matplotlib pyplot as plt 创建数据 X np aran
  • 【华为OD统一考试B卷

    在线OJ 已购买本专栏用户 请私信博主开通账号 在线刷题 运行出现 Runtime Error 0Aborted 请忽略 华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一
  • <van-empty description=““ /> 滚动条bug

    使用
  • 用 echarts画图时tooltip.formatter参数params不会更新

    使用echarts画地图时 遇到一个很奇怪的问题 首先说明我的目的 为了让地图漂亮些 不同的地图区域显示不同的颜色 由于待绘制的地图二级地市数量不确定 需要通过解析获取到的数据来确定 因此我在 series的itemStyle中采用了函数来
  • mysql 查询两个时间段是否有交集的情况

    只要查询自己选择的时间段 和 数据库里面的时间段 是否有交集 就可以了 数据库的字段 start time end time 输入的字段 a b 第一种 SELECT FROM test table WHERE start time gt
  • FPGA学习日记(二)使用quartusII创建ip核

    使用quartusII创建各类ip核 操作大体上都相似 区别在于根据实际需求对ip核进行设置 下面以pll的ip核创建为例 讲述ip核的一般创建过程 step1 找到tools下的魔棒选项 step2 选择创建一个新的ip核还是导入已有的i
  • 华为OD岗位机试指南

    首先 自己要去熟悉编程语言的方法 找一些题目来做 比如力扣的中等题目 过往的OD机试题目 主要学习解题思想 看代码里高级写法 而不是仅仅收藏 照抄 同时一定要优先熟悉牛客网的编程环境 尽量在网页编辑 本地编译会导致粘贴时错行 会很坑的 其次
  • 图像分类:搭建AlexNet并定义加载训练特定数据集

    目录 前言 AlexNet搭建 模型架构 卷积神经网络输出 层设置 模型代码 数据集定义加载 自定义数据集 数据集定义代码 读取txt文件 处理加载数据集 数据集加载代码 训练测试 训练过程 测试过程 前言 AlexNet模型是2012由A
  • qemu-system-x86_64 命令创建虚拟机,报gtk initialization failed的

    因为是ssh命令行启动 增加 nographic opt debug bin qemu system aarch64 machine virt 6 2 qmp tcp localhost 1238 server nowait nograph
  • npm离线安装全局模块包

    首先下载所需的npm模块包及其所有依赖项 使用以下命令将模块包及其依赖项下载到一个目录中 npm pack
  • 显式链接、隐式链接和显式加载、隐式加载以及动态库路径查找

    我们知道库一般有静态库和动态库2种 静态库是编译时就链接到可执行文件中的 动态库是在程序运行时再进行加载的 故本文讨论的链接与加载方式是指对动态库而言的 一 动态库的加载方式 1 隐式加载 就是我们需要准备好 h lib或者 so 对头文件
  • 使用libcurl步骤4之curl_easy_perform

    文章采集自互联网 仅做学习笔记使用 curl easy perform 同步执行文件传输 名称 curl easy perform 执行阻止文件传输 概要 include
  • 如何在vue项目中使用Highmaps(vue+Highmaps)

    如何在vue项目中使用Highmaps 功能需求 思路 分析 实现 第一步 引入 第二步 介绍一下这个world是个啥 第三步 调用 注意点 十分重要 写在最后 功能需求 近日我接到了这么一个需求 原型如下 在系统中需要绘制一个图表 世界地
  • 【9月比赛合集】9场可报名的「创新应用」、「数据分析」和「程序设计」大奖赛,任君挑选!

    CompHub 1 实时聚合多平台的数据类 Kaggle 天池 和OJ类 Leetcode 牛客 比赛 本账号会推送最新的比赛消息 欢迎关注 以下信息仅供参考 以比赛官网为准 目录 创新应用赛 2场比赛 程序设计赛 7场比赛 创新应用赛 2
  • 华为nova7支持升级鸿蒙os的机型,华为全面进入鸿蒙OS时代,这些机型包括荣耀或将都可升级...

    原标题 华为全面进入鸿蒙OS时代 这些机型包括荣耀或将都可升级 之前 华为已经爆出将适配EMUI 11 1系统 而这款最新系统的内核将换成鸿蒙OS 这意味着华为开始全面进入鸿蒙OS时代 也就是国产系统时代 而之前消息显示 前期仅有13款机型
  • Android开发和安全系列工具

    原文 http sec redclub com index php archives 439 spm a313e 7916648 0 0 lvpNiu 取证工具 bandicoot https github com yvesalexandr
  • Modbus网关的 四种类型

    概述 Modbus网关是一种能够将Modubs TCP协议转化为Modbus RTU协议的设备 Modbus广泛应用于仪表和传感器领域 可以获得仪表和传感器的数据 但是传统的基于RS485的Modbus RTU 或ASCII 速度和扩展性较
  • DDoS攻击实验笔记

    DoS DDoS简介 DoS Denial of Service 拒绝服务攻击是通过一些方法影响服务的可用性 比如早期主要基于系统和应用程序的漏洞 只需要几个请求或数据包就能导致长时间的服务不可用 但易被入侵检测系统发现 DDoS Dist
  • 试题管理系统[详细步骤&内含源码]

    试题管理系统 需求 1 数据库中试题信息的动态展示功能 2 增加试题 3 删除单个试题功能 删除多个试题功能 4 分页查询并展示功能 所用技术 MyBatis SpringMVC idea Maven 数据库 Jsp 步骤 建表 建立表格
  • 对比学习做了什么?

    什么是对比学习 对比学习貌似处于 无明确定义 有指导原则 的状态 什么是对比学习呢 这个是微信链接 全文比较长 但是逻辑框架还是不错的 如果想要更快速的了解什么是对比学习或者说对比学习是怎么做的 可以看SimCLR这个模型文章 该文章可以说