多模态预训练模型CLIP:Learning Transferable Visual Models From Natural Language Supervision 从自然语言监督中学习可迁移的视觉模型

  • 摘要
  • 1. 引言
  • 2. 方法
    • 2.1 自然语言监督
    • 2.2 创建足够大的数据集
    • 2.3 选择一种有效的预训练方法
    • 2.4 选择和缩放模型
    • 2.5 训练
  • 3. 实验
    • 3.1 zero-shot 迁移
      • 3.1.1 与Visual N-Grams对比
      • 3.1.2 Prompt Engineering and Ensembling
      • 3.1.3 CLIP的zero-shot分类
      • 3.1.4 CLIP的few-shot分类
    • 3.2 表示学习
      • 3.2.1 与SOTA模型对比
      • 3.2.2 与Noisy Student EfficientNet-L2 对比
    • 3.3 对自然分布偏移的鲁棒性
  • 4. 与人的表现对比
  • 5. 数据重叠分析
  • 6. 局限性
  • 7. 总结

论文链接:https://arxiv.org/abs/2103.00020
代码链接:https://github.com/OpenAI/CLIP
论文讲解视频:CLIP论文逐段精读

摘要

目前最先进的计算机视觉系统被训练来预测一组提前定义好的物体类别。这种受限的监督形式限制了它们的通用性和可用性,因为需要额外的标签数据来指定其他视觉概念。直接从原始文本中学习图像是一个很有前途的选择,它利用了更广泛的监督来源。我们证明了简单的预训练任务,即预测哪个标题与哪个图像对应,是一种高效的、可扩展的方法,可以在从互联网上收集的4亿对(图像、文本)数据集上从头学习SOTA图像表示。在预先训练之后,自然语言被用来引用学习到的视觉概念(或描述新的概念),从而实现模型向下游任务的zero-shot迁移。我们在30多个不同的计算机视觉数据集上进行基准测试,这些数据集涵盖了OCR、视频中的动作识别、地理定位和许多类型的细粒度对象分类等任务。该模型可以有效地zero-shot迁移到大多数任务中,并且通常能够与完全监督的baseline模型相竞争。例如在ImageNet数据集上,CLIP模型在不使用任何一张那128万个数据的情况下,能跟一个有监督的训练好的ResNet-50打成平手。


1. 引言

  • 近年来,直接从原始文本中学习的预训练方法已经彻底改变了NLP领域。无论是自回归预测还是掩码完形填空,都是一种自监督训练的方式,这些与下游任务无关的目标在计算资源、模型容量和数据规模方面已经扩展了多个数量级,模型的能力也因此稳步提升。这种“文本进文本出” 、利用自监督信号训练模型的方法使得预训练好的模型能够zero-shot迁移到下游任务中,而无需再研究一个针对特定任务的输出头,或针对特定数据集进行特殊处理。 一些先进的NLP模型(例如BERT、GPT),使用大规模的无监督数据进行预训练,可以在多个下游任务中获得非常好的结果,甚至超过了使用人工标注的数据训练出的模型。
  • 现有的CV模型基本都是基于人工标注的数据集训练的(例如ImageNet),大多都只能预测已知的图像类别,对于没有见过的图像类别,需要额外的信息才能识别,这就导致模型的可迁移性和泛化能力较差。而文本能够提供额外的信息,那么直接从文本中学习可扩展的预训练方法能否在计算机视觉领域带来类似的突破呢?
  • 使用自然语言监督进行图像表示学习的工作很少,并且效果往往不如有监督模型。作者认为一个关键原因是规模不够。

2. 方法

本文提出了对比语言–图像预训练模型 Contrastive Language-Image Pretraining(CLIP),CLIP的模型比较简单,采用的是经典的双塔结构。在训练时,CLIP联合训练图像编码器和文本编码器来预测一批文本和图像的正确配对。在测试时,学习过的文本编码器通过嵌入目标数据集中类的名称或描述来合成zero-shot线性分类器。

训练:

每个训练batch都包含N个图像–文本对,配对的图像–文本对是正样本,不配对的图像–文本对就是负样本,因此能够得到N个正样本和N2-N个负样本。在特征矩阵里,对角线上就都是正样本,矩阵里剩下所有不是对角线上的元素就都是负样本了。一旦有了正负样本,模型就可以通过对比学习的方式进行训练,完全不需要任何手工的标注。

  • 首先,分别将图像和文本送入图像编码器和文本编码器,得到图像和文本的特征表达;然后通过线性映射层将得到的图像特征和文本特征都映射到相同的嵌入特征维度;为了保持数据尺度的一致性,对其进行L2标准化;这里 I I I1I I IN以及 T T T1T T TN表示一个batch的图像和文本对应的嵌入特征。

  • 然后对图像嵌入特征和文本嵌入特征进行矩阵相乘,计算每两个之间的余弦相似度。通过联合训练图像编码器和文本编码器来学习多模态嵌入空间,以最大化N个匹配的正样本对的余弦相似度,同时最小化N2-N个不匹配的负样本对的余弦相似度。

  • 对于每个图像输入在行方向上都相当于是一个分类器,对于文本输入则在列方向上是分类器。对每一行和每一列求交叉熵损失,加和求平均就是模型的总损失。

推理:

  • 以ImageNet数据集为例。图中文本编码器和图像编码器是已经训练好的CLIP中的文本和图像编码器,要对任意一张来自ImageNet的图像进行分类,由于大部分数据集的标签都是以单词的形式存在的,而预训练阶段的文本描述大多都是一个句子,为了填补这种数据分布上的差别,要对标签进行扩展。以图中为例,可以用 a photo of a {object}. 作为文本端的输入,其中 {object} 就是需要预测的样本标签。

  • 将扩展后的文本经过文本编码器和L2标准化,得到所有类别的向量表示 T T T1T T TN,同样将需要预测的图像经过图像编码器和标准化得到向量表示 I I I1,然后计算 I I I1T T T1T T TN的余弦相似度,其中相似度最高的就是该图像对应的文本数据。

2.1 自然语言监督

本文方法的核心是在自然语言的监督中学习。从自然语言中学习有几个潜在的优势:

  • 与用于图像分类的标准标签相比,扩展自然语言要更容易,因为它不要求标注内容采用经典的“机器学习兼容格式”;

  • 与大多数无监督或自监督学习方法相比,自然语言学习不仅是学习一种表示,同时也将该表示与语言联系起来,从而实现灵活的zero-shot迁移。

2.2 创建足够大的数据集

本文构建了一个包含4亿个图像–文本对的新数据集 WebImageText(WIT),这些都是从网上的各种公开可用的资源中收集的。并且这个数据集中的文本都是与图像相关的句子,而不是单词,因此提供了足够的自然语言数据。

由于WIT数据集足够大,所以本文采用的唯一的数据增强就是一个随机的裁剪。

2.3 选择一种有效的预训练方法

作者发现训练效率对于多模态预训练的成功是非常重要的。

图中蓝色线是用Transformer模型来根据图像预测文字;橙色线是采用词袋预测;绿色线是CLIP采用的对比学习。

  • 基于Transformer做预测型任务(例如OpenAI的GPT模型),就是说给定一张图片,去预测这张图片所对应的文本,也就是图片的标题。但对于一张图片来说,可以有很多种不同的描述,文本之间的差距是非常巨大的。如果用这种预测型的任务去预训练这个模型的话,就有太多的可能性了,那这个模型训练的就非常慢。

  • 词袋预测并不需要把句子中每个词都按顺序准确预测出来,只需要预测出词就够了,乱序也可以。例如给定一张图片,只要模型能预测出“cat”、“my”和“cute”这些词语,即使顺序是错的也算正确,相对而言约束就被放宽了。从图中可以看到,采用词袋预测的方式,效率比原来Transformer模型提升了3倍。

  • 如果把这个训练任务变成一个对比的任务,也就是说只需要判断这个图片和这个文本是不是一个配对,而不再需要去预测文本,那这个约束就进一步被放宽了。作者发现仅仅把这个预测型的目标函数换成一个对比型的目标函数,训练效率一下就提升了4倍。这也就说明了基于对比学习的训练方法是非常高效的。

2.4 选择和缩放模型

模型的选择:

  • 图像编码器采用了两种结构:

    (1)以ResNet-50作为基础架构,使用ResNetD和抗锯齿rect-2模糊池对其进行改进,并用基于注意力的池化层去替代ResNet的全局平均池化层(注意池由一个单层的“Transformer-style”多头QKV注意力来实现)。

    (2)对Vision Transformer进行微小的修改,在Transformer之前的patch和position embeddings添加一个额外的层归一化,并使用稍微不同的初始化方案。

  • 文本编码器采用Transformer结构,模型基本尺寸为63M参数、12层512宽、8个注意力头。

模型的缩放:

2.5 训练

作者一共训练了5个ResNets 和3个Vision Transformers,训练了32个epoch,并设置了非常大的32768的minibatch。

  • 5个ResNets:ResNet-50、ResNet-101、RN50x4、RN50x16 和RN50x64。(RN50x4、RN50x16 和RN50x64遵循EfficientNet-style的模型缩放,并使用ResNet-50的4倍、16倍和64倍的计算量)

  • 3个Vision Transformers:ViT-B/32、ViT-B/16 和ViT-L/14。(这里的32、16、14指的是patch的大小)


3. 实验

3.1 zero-shot 迁移

3.1.1 与Visual N-Grams对比

作者将CLIP与Visual N-Grams对zero-shot迁移的图像分类结果进行了比较,Visual N-Grams是第一个将zero-shot迁移应用到图像分类任务上的模型。由表中可以看出,CLIP大大提高了在这三个数据集上的分类性能,其中CLIP在没有微调的情况下在ImageNet上的分类效果和ResNet-50是差不多的。

3.1.2 Prompt Engineering and Ensembling

作者还验证了采用prompt的有效性。在本文中prompt指的是提示上下文,它起到一个提示的作用,也就是文本引导的作用。

  • 对于一些数据集,单独的一个标签并不能很好的描述图片内容,同一个词语在不同数据集中所表示的意思可能有所不同(例如在 Oxford-IIIT Pets 数据集中,boxer指的是狗的一个种类,在其他数据集中指的是拳击运动员)。这种词语的多义性是因为缺少对标签的上下文描述而导致的。

  • 本文的数据集中用来描述图片内容的文本通常是一个句子,而不是一个单词。

为了解决以上两个问题,作者想了一个非常简单的方式去做prompt engineering,就是用一个提示的模板将标签单词扩展为句子。例如 A photo of a {label},这里 {label} 就对应不同的标签。并且可以根据不同的数据集来调整这个模板,进而提升zero-shot的性能。例如当数据集是Oxford-IIIT Pets数据集时,就可以在 A photo of a {label} 的基础上添加一句 a type of pets;或者在做OCR任务时,也就是从给定的一张图片中找文字数字这种任务时,如果你在想找的那个文本或者数字上打上双引号,模型就可能知道你是想找双引号里面的内容。

作者还对文本做了prompt ensembling,这里作者尝试了在多个zero-shot分类器上进行集成,这些分类器使用不同的提示模板来构造不同的文本。由于是在嵌入空间(embedding space)而不是概率空间(probability space)上集成的,因此节约了计算成本。在大多数数据集上,prompt ensembling都能够提升模型性能。

横坐标表示模型算力,纵坐标表示在多个数据集上的平均分数,绿色曲线表示本文中使用Prompt engineering and ensembling的结果,蓝色曲线表示直接使用无提示上下文的类名的结果。

由图中可以看出,算力在75.3时,有prompt的分数会比不用prompt的高上近5个百分点。当分数在55%时,不用prompt的模型需要花上近4倍的算力,才能赶上用prompt的效果。这个结果说明通过提供标签的上下文信息可以有效地提高zero-shot效果。

3.1.3 CLIP的zero-shot分类

为了测试CLIP的zero-shot分类的效果怎么样,作者将在27个数据集上的分类效果做成了对比图,图中就是CLIP与基于ResNet-50做Linear Probe的对比。

Linear Probe就是把一个预训练好的模型冻住,只从里面抽特征,就训练最后一层的分类头层去做有监督的分类任务。这里的Linear Probe on ResNet50是在ImageNet上用有监督的方式预训练ResNet50,然后扔掉最后一层全连接层,把模型剩余部分当作特征提取器,然后在这些下游任务上训练新的分类头。


绿色 + 表示相比ResNet-50提升了多少,蓝色 - 表示相比ResNet-50降低了多少。

从图中可以看到,在27个数据集中,CLIP在16个数据集上都超越了有监督训练好的ResNet-50。

  • 对于普通的物体分类任务,CLIP可以很好的做zero-shot迁移,例如车、食物、CIFAR10等数据集,因为图像中有可以描述出来的物体,那对应的文本中也就有这种描述,因此可以很好的匹配;

  • 但CLIP对于更加复杂或抽象的任务就表现比较弱,例如卫星图像分类、淋巴结肿瘤检测等需要特定领域知识的分类任务。

3.1.4 CLIP的few-shot分类

本文同样将CLIP应用在了few-shot分类中,图中是zero-shot CLIP与 few-shot Linear Probe方法的对比。


横坐标表示在每个类别里用了多少个标注样本进行Linear Probe的分类器训练,纵坐标表示在20个数据集上的平均分类准确度。

  • zero-shot CLIP的性能超过了很多few-shot learning的模型性能;

  • 蓝色曲线对应的是BiT-M模型,在这里,BiT模型是在ImageNet-21k上做预训练的,数据集也比较大,所以非常具有代表性,是一个很强的baseline。然而当每类有16个训练样本时,BiT模型的性能才和zero-shot CLIP打成平手;

  • 紫色曲线对应的是对CLIP中的图像编码器做Linear Probe。在当每类的训练样本只有1个或2个的时候,效果还不如zero-shot CLIP;但当每类的训练样本增加到8个或16个的时候,效果则超越了zero-shot CLIP,并且显然比其他模型表现更加优秀。这也验证了作者之前的想法,对于一些难的数据集来说,有一些训练样本还是非常有必要的。

CLIP在做Linear Probe的时候,需要扔掉文本编码器部分,接着在图像编码器之后加一层线性分类器,所以分类方式不再是看图像特征与文本特征最相近,而是重新训练一个线性分类器,并且因为新加的一层线性分类器是随机初始化的,所以每类有1个标注样本是不够的。这也是为什么一开始性能会比较差,但随着训练样本的增多,模型的分类性能会逐渐提升。

3.2 表示学习

3.2.1 与SOTA模型对比

无论是无监督还是自监督,表示学习的方法都是先预训练一个模型,然后在下游任务中用全部的数据去做微调。所以如果用了全部的数据,就可以跟之前的特征学习的方法做公平对比了。

那如果下游任务用全部的数据,就有很多种方法去衡量这个模型学到的特征好不好。最常见的两种方式,一种是Linear Probe,另外一种就是微调。这里作者选择Linear probe CLIP与最先进的计算机视觉模型进行比较。

这里选择Linear probe而不是微调的主要原因是,微调是把整个网络都放开,直接去做端到端的学习;而Linear probe是用线性分类头的方式,模型大部分都是冻住的,只有最后一层FC是可以训练的,可学习的空间比较小,相比微调没那么灵活。如果预训练模型没有训练好的话,在下游任务上训练再久也很难优化到一个特别好的结果,所以用Linear probe能更准确的反映预训练模型的好坏。

横坐标表示对于一张图像来说,做一遍前向过程用多少的计算量;纵坐标表示在多个数据集上的平均准确率。不同的线代表不同的模型,这里包括使用不同结构的图像编码器的CLIP模型、有监督的EfficientNet、用了伪标签的EfficientNet、弱监督的在Instagram上训练的模型、自监督的对比学习模型、以及一些经典的有监督的baseline模型。结果越靠近左上角,模型的性能越好。左图是在12个数据集上的平均结果,这12个数据集和ImageNet是类似的,右图是在27个数据集上的平均结果。

从图中可以看到,在12个数据集上,用ViT结构的CLIP效果最好,用ResNet的效果也比大多数模型要好;在27个数据集上,CLIP的效果就吊打其他所有模型了。这个结果就证明了CLIP模型的强大。

本文还展示了这些模型在27个数据集上的单个得分,感兴趣的可以去看一下本文的附录。

3.2.2 与Noisy Student EfficientNet-L2 对比

作者还在27个数据集上可视化了CLIP模型和用伪标签训练的EfficientNet的性能差异。


从图中可以看到,CLIP在21个数据集上的性能都超过了EfficientNet,并且很多数据集都是大比分超过。在其余6个表现不如EfficientNet的数据集上,CLIP也只比EfficientNet稍微低一点,差距并不大。

3.3 对自然分布偏移的鲁棒性

作者还比较了zero-shot CLIP与现有ImageNet模型在自然分布偏移上的性能来验证它的鲁棒性。

  • 左图的横纵坐标是ImageNet的分布偏移。黑色虚线是理想的鲁棒模型,是线性的、正比例的。普通的模型无法达到这样的理想效果,画出来的曲线只会在黑色虚线的下面。但这里可以看出zero-shot CLIP的鲁棒性比标准的ImageNet训练的模型更好。

  • 右图是zero-shot CLIP与在ImageNet上有监督训练的ResNet101的对比。这里的ImageNetV2是从ImageNet数据集中筛选出新的数据集,这使得新的数据集更接近原来的测试集,然而在ImageNet上预训练的模型,在这个ImageNetV2上的测试性能下降了不少(76.2→64.3)。另外本文还构造了更难的数据集,例如ImageNet Sketch都是素描的图片、ImageNet-A包含很多对抗样本,但这些数据集图片的类别还是香蕉,所以在ImageNet上训练的模型,应该是能够分类这些图片的。从实验结果可以看到,zero-shot CLIP的性能和有监督训练的ResNet101在ImageNet上的分类精确度是一样的。但随着数据集难度的增加,ResNet101的分类精度一直在大幅下降,相比之下,zero-shot CLIP并没有随着数据集难度加大而出现性能下降很多的情况,所以可以说明CLIP的鲁棒性更好。


4. 与人的表现对比

这里作者找了5个人,这5个人在Oxford-IIIT Pets 数据集的测试图像上的分类表现与zero-shot CLIP的对比结果如下表所示。


另外,作者针对每一类的分类准确度也做了对比。从图中可以发现,对CLIP来说很难识别的类别,人也很难识别。


5. 数据重叠分析

在非常大的互联网数据集上进行预训练会无意中与下游评估任务的数据重叠。这一点很重要,因为在最坏的情况下,评估数据集的完整样本可能会泄漏到预训练数据集中,这样就使得评估的泛化测试无效。作者分析了训练集和下游任务数据的重叠程度,以及这种重叠对模型效果的影响。

  • 左:虽然几个数据集在检测到的重叠和干净示例上的zero-shot准确度有高达±20%的明显差异,但在35个数据集中只有5个具有99.5%的Clopper-Pearson置信区间,排除了0%的准确度差异。其中2个数据集在重叠数据上表现更差。
  • 右:由于检测到的重叠示例的百分比几乎总是个位数,因此由于重叠导致的整体测试准确度增益要小得多,Birdsnap的最大增幅仅为0.6%。同样,当使用单边二项式检验计算时,只有6个数据集的准确性提高具有统计学意义。

由此可以得出结论,这样的数据重叠不会带来明显的准确率提升。


6. 局限性

(1)CLIP在很多数据集上,平均下来看可以和ResNet-50打成平手,但与现在最好的模型(最新最大的Vision Transformer,或者MAE)还存在十几个点的差距。预测大概还需要当前1000倍的规模才可以弥补上十几个点的这个差距,这样的代价太大,并且现有的硬件条件也无法完成。

(2)CLIP在一些更抽象或更复杂的任务上zero-shot表现并不好。例如数一数图片中有多少个物体,或者在监控视频里区分当前这一帧是异常还是非异常。

(3)对于自然图像的分布偏移,CLIP还是相对稳健的。但如果在做推理时,数据和训练时的数据相差太远,CLIP模型的泛化能力还是很差。例如MNIST数据集,随便一个分类器都比CLIP的分类效果好。

(4)虽然CLIP可以做zero-shot的分类任务,但它还是从给定的那些类别里去做选择,无法直接生成图像的标题。

(5)对数据的利用不是很高效,需要大量的数据。在本文的训练过程中,4亿个样本跑了32个epoch,这相当于过了128个数据,数据量是非常庞大的。

(6)本文在研发CLIP时一直用ImageNet测试集做指导,并非真正的zero-shot。

(7)OpenAI自建的数据集没有清洗,因为是从网上爬取的,没有经过过滤和审查,训练的CLIP模型很有可能带有一些社会偏见,例如性别、肤色。

(8)很多复杂的任务或概念无法用文本准确描述,这时就需要提供给模型一些训练样本。但当给CLIP提供少量训练样本时,结果反而不如直接用zero-shot。例如3.1.4中CLIP的few-shot分类。


7. 总结

本文提出了一个基于双塔结构的CLIP模型,并选择图像–文本配对的对比训练方法,在数据量足够的情况下,可以在预训练阶段学习到很多通用的视觉语义概念,预训练后的模型可以通过自然语言提示来实现对许多现有数据集的zero-shot迁移。在足够的规模下,这种方法的性能可以与特定任务的监督模型相竞争,但仍存在很大的改进空间。

CLIP学习笔记:Learning Transferable Visual Models From Natural Language Supervision相关推荐

  1. CLIP Learning Transferable Visual Models From Natural Language Supervision (文本和图像的对比学习)--文献翻译和笔记

    论文链接:[2103.00020] Learning Transferable Visual Models From Natural Language Supervision (arxiv.org) ...

  2. CLIP 论文学习笔记《Learning Transferable Visual Models From Natural Language Supervision》

    ​论文标题:Learning Transferable Visual Models From Natural Language Supervision 论文地址:https://arxiv.org/a ...

  3. CLIP论文笔记--《Learning Transferable Visual Models From Natural Language Supervision》

    CLIP论文笔记--<Learning Transferable Visual Models From Natural Language Supervision> 1.Introducti ...

  4. 【论文视频】Clip:Learning Transferable Visual Models From Natural Language Supervision【多模态,对比学习,迁移学习】

    CLIP:Contrast Language Image Pre-training 文章目录 1. 四个问题 2. 论文介绍 研究动机:zero-shot Clip的预训练 Clip伪代码 Clip的 ...

  5. 重读经典(CLIP下):《Learning Transferable Visual Models From Natural Language Supervision》

    上文链接:重读经典(CLIP上):<Learning Transferable Visual Models From Natural Language Supervision> 5. 实验 ...

  6. CLIP: Learning Transferable Visual Models From Natural Language Supervision

    目录 Introduction Approach CLIP Prompt Engineering and Ensembling Experiments Analysis of Zero-shot CL ...

  7. 【论文简介】CLIP:图像与自然语言配对预训练可迁移模型:Learning Transferable Visual Models From Natural Language Supervision

    论文链接: 2103.Learning Transferable Visual Models From Natural Language Supervision 项目官网: CLIP: Contras ...

  8. CLIP论文翻译、Learning Transferable Visual Models From Natural Language Supervision翻译

    CLIP论文翻译.Learning Transferable Visual Models From Natural Language Supervision翻译 文章目录 CLIP论文翻译.Learn ...

  9. 【论文模型讲解】CLIP(Learning Transferable Visual Models From Natural Language Supervision)

    文章目录 前言 0 摘要 1 Introduction and Motivating Work 2 Approach 2.0 模型整体结构 2.1 数据集 2.2 选择一种高效的预训练方法 2.3 模 ...

最新文章

  1. logsoftmax前面为什么没用激活函数,有与没有影响不大吗,难道是这个原因,求明白的高手解答
  2. 待续未完- 自己写后台内容管理程序 - 完全手写不用框架的
  3. sqlserver中将行数据转为Xml文件格式
  4. 【Java学习笔记】字符串和Date的转换
  5. CentOS 6.2安装
  6. 基于AI的超分辨技术在RTC领域的技术难点与挑战
  7. 转正老板让你谈谈你的看法_让我们谈谈逻辑回归
  8. 市场活动课件:SQL Server 索引优化
  9. 【转】Pro Android学习笔记(一):Android 平台 2013.6.4
  10. ConcurrentProgramming:ThreadLocal(jdk8)
  11. Spring Boot 之事件(Event)
  12. 微课|《Python编程基础与案例集锦(中学版)》第4章例题讲解(3)
  13. 《IT蓝豹》PlayNewsStandDemo资讯类新闻客户端框架
  14. 有时我都非常讨厌自己,特别容易相信人
  15. 在Ubuntu系统中安装字体(以安装华文行楷和方正舒体为例)
  16. 使用深度学习进行表检测、信息提取和构建
  17. 关于勾股数的规律及证明
  18. PHP剧影评系统的设计与实现毕业设计源码140859
  19. SecureCrt 连接服务器失败 key exchange failed 解决方案
  20. python代码画人物_Python绘制可爱的卡通人物 | 【turtle使用】

热门文章

  1. 30.7.1 通过mysqladmin修改用户密码
  2. 8g内存一般占用多少_8g内存开机占用一半|Windows操作系统内存使用率多少正常?...
  3. 2022年零基础自学网络安全/Web安全,看这一篇就够了
  4. 阿里云后台测试短信模板
  5. DebugView Windows 7 不显示调试信息
  6. 概率分析和随机算法_雇佣问题
  7. 浅析GIS行业地图绘制基本要求
  8. libxml2库函数详解
  9. Apache Tez
  10. 用HTML和css写的界面适应手机界面小结