神器CLIP:连接文本和图像,打造可迁移的视觉模型

news2025/2/21 20:19:10

2021年见证了vision transformer的大爆发,随着谷歌提出ViT之后,一大批的vision transformer的工作席卷计算机视觉任务。除了vision transformer,另外一个对计算机视觉影响比较大的工作就是Open AI在2021年1月份发布的DALL-E和CLIP,这两个都属于结合图像和文本的多模态模型,其中DALL-E是基于文本来生成模型的模型,而CLIP是用文本作为监督信号来训练可迁移的视觉模型,这两个工作也像ViT一样带动了一波新的研究高潮。这篇文章将首先介绍CLIP的原理以及如何用CLIP实现zero-shot分类,然后我们将讨论CLIP背后的动机,最后文章会介绍CLIP的变种和其它的一些应用场景。

CLIP是如何工作的

CLIP的英文全称是Contrastive Language-Image Pre-training,即一种基于对比文本-图像对的预训练方法或者模型。CLIP是一种基于对比学习的多模态模型,与CV中的一些对比学习方法如moco和simclr不同的是,CLIP的训练数据是文本-图像对:一张图像和它对应的文本描述,这里希望通过对比学习,模型能够学习到文本-图像对的匹配关系。如下图所示,CLIP包括两个模型:Text EncoderImage Encoder,其中Text Encoder用来提取文本的特征,可以采用NLP中常用的text transformer模型;而Image Encoder用来提取图像的特征,可以采用常用CNN模型或者vision transformer。

这里对提取的文本特征和图像特征进行对比学习。对于一个包含N个文本-图像对的训练batch,将N个文本特征和N个图像特征两两组合,CLIP模型会预测出N2个可能的文本-图像对的相似度,这里的相似度直接计算文本特征和图像特征的余弦相似性(cosine similarity,即上图所示的矩阵。这里共有N个正样本,即真正属于一对的文本和图像(矩阵中的对角线元素),而剩余的N2−N个文本-图像对为负样本,那么CLIP的训练目标就是最大N个正样本的相似度,同时最小化N2−N个负样本的相似度,对应的伪代码实现如下所示:

# image_encoder - ResNet or Vision Transformer
# text_encoder - CBOW or Text Transformer
# I[n, h, w, c] - minibatch of aligned images
# T[n, l] - minibatch of aligned texts
# W_i[d_i, d_e] - learned proj of image to embed
# W_t[d_t, d_e] - learned proj of text to embed
# t - learned temperature parameter

# 分别提取图像特征和文本特征
I_f = image_encoder(I) #[n, d_i]
T_f = text_encoder(T) #[n, d_t]

# 对两个特征进行线性投射,得到相同维度的特征,并进行l2归一化
I_e = l2_normalize(np.dot(I_f, W_i), axis=1)
T_e = l2_normalize(np.dot(T_f, W_t), axis=1)

# 计算缩放的余弦相似度:[n, n]
logits = np.dot(I_e, T_e.T) * np.exp(t)

# 对称的对比学习损失:等价于N个类别的cross_entropy_loss
labels = np.arange(n) # 对角线元素的labels
loss_i = cross_entropy_loss(logits, labels, axis=0)
loss_t = cross_entropy_loss(logits, labels, axis=1)
loss = (loss_i + loss_t)/2

为了训练CLIP,OpenAI从互联网收集了共4个亿的文本-图像对,论文称之为WebImageText,如果按照文本的单词量,它和训练GPT-2的WebText规模类似,如果从数量上对比的话,它还比谷歌的JFT-300M数据集多一个亿,所以说这是一个很大规模的数据集。CLIP虽然是多模态模型,但它主要是用来训练可迁移的视觉模型。论文中Text Encoder固定选择一个包含63M参数的text transformer模型,而Image Encoder采用了两种的不同的架构,一是常用的CNN架构ResNet,二是基于transformer的ViT,其中ResNet包含5个不同大小的模型:ResNet50ResNet101RN50x4RN50x16RNx64(后面三个模型是按照EfficientNet缩放规则对ResNet分别增大4x,16x和64x得到),而ViT选择3个不同大小的模型:ViT-B/32ViT-B/16ViT-L/14。所有的模型都训练32个epochs,采用AdamW优化器,而且训练过程采用了一个较大的batch size:32768。由于数据量较大,最大的ResNet模型RN50x64需要在592个V100卡上训练18天,而最大ViT模型ViT-L/14需要在256张V100卡上训练12天,可见要训练CLIP需要耗费多大的资源。对于ViT-L/14,还在336的分辨率下额外finetune了一个epoch来增强性能,论文发现这个模型效果最好,记为ViT-L/14@336,论文中进行对比实验的CLIP模型也采用这个。

如何用CLIP实现zero-shot分类

上面我们介绍了CLIP的原理,可以看到训练后的CLIP其实是两个模型,除了视觉模型外还有一个文本模型,那么如何对预训练好的视觉模型进行迁移呢?与CV中常用的先预训练然后微调不同,CLIP可以直接实现zero-shot的图像分类,即不需要任何训练数据,就能在某个具体下游任务上实现分类,这也是CLIP亮点和强大之处。用CLIP实现zero-shot分类很简单,只需要简单的两步:

  1. 根据任务的分类标签构建每个类别的描述文本:A photo of {label},然后将这些文本送入Text Encoder得到对应的文本特征,如果类别数目为N,那么将得到N个文本特征;
  2. 将要预测的图像送入Image Encoder得到图像特征,然后与N个文本特征计算缩放的余弦相似度(和训练过程一致),然后选择相似度最大的文本对应的类别作为图像分类预测结果,进一步地,可以将这些相似度看成logits,送入softmax后可以到每个类别的预测概率。

可以看到,我们是利用CLIP的多模态特性为具体的任务构建了动态的分类器其中Text Encoder提取的文本特征可以看成分类器的weights,而Image Encoder提取的图像特征是分类器的输入。这里我们给出了一个基于CLIP的一个实例(参考官方notebook),这里任务共有6个类别:"dog", "cat", "bird", "person", "mushroom", "cup",首先我们创建文本描述,然后提取文本特征:

# 首先生成每个类别的文本描述
labels = ["dog", "cat", "bird", "person", "mushroom", "cup"]
text_descriptions = [f"A photo of a {label}" for label in labels]
text_tokens = clip.tokenize(text_descriptions).cuda()

# 提取文本特征
with torch.no_grad():
    text_features = model.encode_text(text_tokens).float()
    text_features /= text_features.norm(dim=-1, keepdim=True)

然后我们读取要预测的图像,输入Image Encoder提取图像特征,并计算与文本特征的余弦相似度:

# 读取图像
original_images = []
images = []
texts = []

for label in labels:
    image_file = os.path.join("images", label+".jpg")
    name = os.path.basename(image_file).split('.')[0]

    image = Image.open(image_file).convert("RGB")
    original_images.append(image)
    images.append(preprocess(image))
    texts.append(name)

image_input = torch.tensor(np.stack(images)).cuda()

# 提取图像特征  
with torch.no_grad():
    image_features = model.encode_image(image_input).float()
    image_features /= image_features.norm(dim=-1, keepdim=True)

# 计算余弦相似度(未缩放)
similarity = text_features.cpu().numpy() @ image_features.cpu().numpy().T

相似度如下所示,可以看到对于要预测的6个图像,按照最大相似度,其均能匹配到正确的文本标签:

进一步地,我们也可以对得到的余弦相似度计算softmax,得到每个预测类别的概率值,注意这里要对相似度进行缩放:

logit_scale = np.exp(model.logit_scale.data.item())
text_probs = (logit_scale * image_features @ text_features.T).softmax(dim=-1)
top_probs, top_labels = text_probs.cpu().topk(5, dim=-1)

得到的预测概率如下所示,可以看到6个图像,CLIP模型均能够以绝对的置信度给出正确的分类结果:

使用CLIP进行zero-shot分类,另外一个比较重要的地方是文本描述的生成,上面的例子我们采用A photo of {label},但其实也有其它选择,比如我们直接用类别标签,这其实属于最近NLP领域比较火的一个研究:prompt learning或者prompt engineering,具体可以见这篇综述论文:Pre-train, Prompt, and Predict: A Systematic Survey of Prompting Methods in Natural Language Processing,简单来说,prompt learning的核心是通过构建合适prompt(提示)来使预训练模型能够直接应用到下游任务,这和之前的预训练+微调属于不同的范式。论文也说了,如果我们直接采用类别标签作为文本描述,那么很多文本就是一个单词,缺少具体的上下文,而且也和CLIP的训练数据不太一致,效果上会不如采用A photo of {label}(ImageNet数据集上可以提升1.3%)。论文也实验了采用80个不同的prompt来进行集成,发现在ImageNet数据集上能带来3.5%的提升,具体见CLIP公开的notebook。下图对比了基于ResNet的CLIP模型直接采用类别名与进行prompt engineering和ensembling的效果对比:

上面我们介绍了如何用CLIP实现zero-shot分类,下面将简单介绍CLIP与其它方法的效果对比,这个也是论文中篇幅最多的内容。首先是CLIP和17年的一篇工作Learning Visual N-Grams from Web Data的在3个分类数据集上zero-shot效果对比,如下表所示,可以看到CLIP模型在效果上远远超过之前的模型,其中在ImageNet数据集可以达到76.2,这和全监督的ResNet50效果相当,不用任何训练数据就能达到这个效果是相当惊艳的。

更进一步地,论文还对比了zero-shot CLIP和ResNet50 linear probing(ImageNet数据上预训练,在加上线性分类层进行finetune)在27个数据集上表现,如下图所示,其中在16个数据集上CLIP可以超过ResNet50。但是在一些特别的,复杂的或者抽象的数据集上CLIP表现较差,比如卫星图像分类,淋巴结转移检测,在合成场景中计数等,CLIP的效果不如全监督的ResNet50,这说明CLIP并不是万能的,还是有改进的空间。如果认真看下图的话,CLIP表现较差的竟然还有MNIST数据集,分类准确度只有88%,这是不可思议的,因为这个任务太简单了,通过对CLIP训练数据进行分析,作者发现4亿的训练数据中基本上没有和MNIST比较相似的数据,所以这对CLIP来说就属于域外数据了,表现较差就比较容易理解了。这也表明:CLIP依然无法解决域外泛化这个深度学习难题。

除了zero-shot对比,论文还对比few-shot性能,即只用少量的样本来微调模型,这里对比了3个模型:在ImageNet21K上训练的BiT-M ResNet-152x2,基于SimCLRv2训练的ResNet50,以及有监督训练的ResNet50。可以看到CLIP的zero-shot和最好的模型(BiT-M)在16-shot下的性能相当,而CLIP在16-shot下效果有进一步的提升。另外一个比较有意思的结果是:虽然CLIP在few-shot实验中随着样本量增加性能有提升,但是1-shot和2-shot性能比zero-shot还差,这个作者认为主要是CLIP的训练和常规的有监督训练存在一定的差异造成的。

除此之外,论文还进行了表征学习representation Learning)实验,即自监督学习中常用的linear probe:用训练好的模型先提取特征,然后用一个线性分类器来有监督训练。下图为不同模型在27个数据集上的average linear probe score对比,可以看到CLIP模型在性能上超过其它模型,而且计算更高效:

另外,论文还发现CLIP在自然分布漂移上表现更鲁棒,比如CLIP和基于ImageNet上有监督训练的ResNet101在ImageNet验证集都能达到76.2%,但是在ImageNetV2数据集上,CLIP要超过ResNet101。在另外的4个分布漂移的数据集上,ResNet101性能下降得比较厉害,但是CLIP能依然保持较大的准确度,比如在ImageNet-A数据集上,ResNet101性能只有2.7%,而CLIP能达到77.1%。

CLIP能实现这么好的zero-shot性能,大家很可能质疑CLIP的训练数据集可能包含一些测试数据集中的样例,即所谓的数据泄漏。关于这点,论文也采用一个重复检测器对评测的数据集重合做了检查,发现重合率的中位数为2.2%,而平均值在3.2%,去重前后大部分数据集的性能没有太大的变化,如下所示:

论文的最后也对CLIP的局限性做了讨论,这里简单总结其中比较重要的几点:

  • CLIP的zero-shot性能虽然和有监督的ResNet50相当,但是还不是SOTA,作者估计要达到SOTA的效果,CLIP还需要增加1000x的计算量,这是难以想象的;
  • CLIP的zero-shot在某些数据集上表现较差,如细粒度分类,抽象任务等;
  • CLIP在自然分布漂移上表现鲁棒,但是依然存在域外泛化问题,即如果测试数据集的分布和训练集相差较大,CLIP会表现较差;
  • CLIP并没有解决深度学习的数据效率低下难题,训练CLIP需要大量的数据;

为什么是CLIP

前面介绍了CLIP的原理和应用,这里我们再回过头来看另外一个问题:为什么是CLIP,即CLIP这篇工作的motivation。 在计算机视觉领域,最常采用的迁移学习方式就是先在一个较大规模的数据集如ImageNet上预训练,然后在具体的下游任务上再进行微调。这里的预训练是基于有监督训练的,需要大量的数据标注,因此成本较高。近年来,出现了一些基于自监督的方法,这包括基于对比学习的方法如MoCo和SimCLR,和基于图像掩码的方法如MAE和BeiT,自监督方法的好处是不再需要标注。但是无论是有监督还是自监督方法,它们在迁移到下游任务时,还是需要进行有监督微调,而无法实现zero-shot。对于有监督模型,由于它们在预训练数据集上采用固定类别数的分类器,所以在新的数据集上需要定义新的分类器来重新训练。对于自监督模型,代理任务往往是辅助来进行表征学习,在迁移到其它数据集时也需要加上新的分类器来进行有监督训练。但是NLP领域,基于自回归或者语言掩码的预训练方法已经取得相对成熟,而且预训练模型很容易直接zero-shot迁移到下游任务,比如OpenAI的GPT-3。这种差异一方面是由于文本和图像属于两个完全不同的模态,另外一个原因就是NLP模型可以采用从互联网上收集的大量文本。那么问题来了:能不能基于互联网上的大量文本来预训练视觉模型?

那么其实之前已经有一些工作研究用文本来作为监督信号来训练视觉模型,比如16年的工作Learning Visual Features from Large Weakly Supervised Data将这转化成一个多标签分类任务来预测图像对应的文本的bag of words;17年的工作Learning Visual N-Grams from Web Data进一步扩展了这个方法来预测n-grams。最近的一些工作采用新的模型架构和预训练方法来从文本学习视觉特征,比如VirTex基于transformer的语言模型,ICMLM基于语言掩码的方法,ConVIRT基于对比学习的方法。整体来看,这方面的工作不是太多,这主要是因为这些方法难以实现较高的性能,比如17年的那篇工作只在ImageNet上实现了11.5%的zero-shot性能,这远远低于ImageNet上的SOTA。另外,还有另外的是一个方向,就是基于文本弱监督来提升性能,比如谷歌的BiT和ViT基于JFT-300M数据集来预训练模型在ImageNet上取得SOTA,JFT-300M数据集是谷歌从互联网上收集的,通过一些自动化的手段来将web text来转化成18291个类别,但是存在一定的噪音。虽然谷歌基于JFT-300M数据集取得了较好的结果,但是这些模型依然采用固定类别的softmax分类器进行预训练,这大大限制了它的迁移能力和扩展性。

作者认为谷歌的弱监督方法和之前的方法的一个重要的区别在于规模,或者说算力和数据的规模不同。JFT-300M数据量达到了上亿级别,而且谷歌用了强大的算力来进行预训练。而VirTex,ICMLM和ConVIRT只在10万级别的数据上训练了几天。为了弥补数据上的差异,OpenAI从网上收集了4亿的数据来实验。但是新的问题来了:采用什么样的方法来训练。OpenAI首先尝试了VirTex模型,即联合训练一个CNN和文本transformer来预测图像的文本(image caption),但是发现这种方法的训练效率(用ImageNet数据集上的zero-shot性能来评估)还不如直接预测bag of words,如下图所示,两者的训练效率能相差3倍。如果进一步采用ConVIRT,即基于对比学习的方法,训练效率可以进一步提升4倍。之所出现这个差异,这不难理解,训练数据所包含的文本-图像对是从互联网收集来的,它们存在一定的噪音,就是说文本和图像可能并不完全匹配,这个时候适当的降低训练目标,反而能取得更好的收敛。而从任务难度来看:Transformer Language Model > Bag of Words Prediction > Bag of Words Contrastive (CLIP)。由于训练数据量和模型计算量较大,训练效率成为一个至关重要的因素。这就是作者最终选择对比学习的方法来训练的原因。

从本质上来讲,CLIP其实并没有太大的创新,它只是将ConVIRT方法进行简化,并采用更大规模的文本-图像对数据集来训练。

在论文的最后,作者也谈到了由于训练效率的制约,他们采用了对比学习的方法,但是他们依然想做的是直接用图像生成文本,这个如果能成功,那么就和DALL-E这个工作形成闭环了:文本 -> 图像 -> 文本。而且基于生成式训练出来的模型,同样可以实现zero-shot分类,我们可以通过预测句子中的单词(标签)来实现:A photo of [?]

CLIP还可以做什么

虽然论文中只对用CLIP进行zero-shot分类做了实验,但其实CLIP的应用价值远不止此,CLIP之后出现了很多基于CLIP的应用研究,这里我们列出一些应用场景

zero-shot检测

CLIP可以应用在目标检测任务上,实现zero-shot检测,即检测训练数据集没有包含的类别,比如谷歌提出的ViLD基于CLIP实现了开放词汇的物体检测,其主体架构如下所示,其基本思路和zero-shot分类相似,只不过这里是用文本特征和ROI特征来计算相似度。

Meta AI的最新工作Detic可以检测2000个类,背后也用到了CLIP:

图像检索

基于文本来搜索图像是CLIP最能直接实现的一个应用,其实CLIP也是作为DALL-E的排序模型,即从生成的图像中选择和文本相关性较高的。

视频理解

CLIP是基于文本-图像对来做的,但是它可以扩展到文本-视频,比如VideoCLIP就是将CLIP应用在视频领域来实现一些zero-shot视频理解任务。

图像编辑

CLIP可以用在指导图像编辑任务上,HairCLIP这篇工作用CLIP来定制化修改发型:

图像生成

CLIP还可以应用在图像生成上,比如StyleCLIP这篇工作用CLIP实现了文本引导的StyleGAN:

CLIP-GEN这篇工作基于CLIP来训练文本生成图像模型,训练无需直接采用任何文本数据:

自监督学习

最近华为的工作MVP更是采用CLIP来进行视觉自监督训练:

VL任务

CLIP本身就是多模态模型,所以它也可以用在用图像-文本多模态任务,如图像描述(image caption)和视觉问答(Visual Question Answering),这篇论文How Much Can CLIP Benefit Vision-and-Language Tasks?系统评估了CLIP在VL任务上带来的收益。

从这些具体的应用可以进一步看到CLIP的强大

除了一些应用研究工作,其实还有针对CLIP的一些改进工作,最新的一篇论文Democratizing Contrastive Language-Image Pre-training: A CLIP Benchmark of Data, Model, and Supervision总结了几种对CLIP的改进:

总结

这篇文章系统地总结了CLIP的原理以及它的具体应用,我个人认为:CLIP和ViT属于相同量级的工作,它们都打破了计算机视觉的原有范式,必将在CV历史上留名

参考

  • https://openai.com/blog/clip/
  • https://github.com/openai/CLIP
  • Learning Transferable Visual Models From Natural Language Supervision
  • CLIP 论文逐段精读【论文精读】 - 知乎
  • https://github.com/yzhuoning/Aw

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

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

相关文章

chatgpt赋能python:一、Python在数据可视化中的应用

一、Python在数据可视化中的应用 Python是一种功能强大的编程语言,早已成为数据科学家和分析师的首选语言。数据可视化对于从数据中汲取信息和传达想法来说至关重要。Python也是数据可视化的理想工具之一。Python提供了许多强大的库,其中包括了一些流行…

( 2023版)互联网 Java 工程师面试题及答案汇总

最近很多粉丝朋友私信我说:熬过了去年的寒冬却没熬过现在的内卷;打开 Boss 直拒一排已读不回,回的基本都是外包,薪资还给的不高,对技术水平要求也远超从前;感觉 Java 一个初中级岗位有上千人同时竞争&#…

【野指针】

野指针 1. 指针是什么?2. 指针和指针类型2.1 指针-整数2.2 指针的解引用 3. 野指针3.1 野指针成因3.2 如何规避野指针 1. 指针是什么? 指针是什么? 指针理解的2个要点: 指针是内存中一个最小单元的编号,也就是地址平…

MySQL性能优化:慢查询优化

一、执行计划 执行计划的语法 在SQL查询的前面加上EXPLAIN关键字就行。比如: EXPLAIN select* from order_exp;执行效果如下。 (一)参数详解: 1、id 在一个大的查询语句中每个SELECT关键字都对应一个唯一的id。我们知道我们写的查询语句一…

【框架源码】Spring源码解析之BeanDefinition加载流程解析

观看本文之前,我们先思考一个问题,Spring是如何描述Bean对象的? Spring是根据BeanDefinition来创建Bean对象,BeanDefinition就是Spring中表示Bean定义。BeanDefinition用来存储Bean的相关信息,主要包括:Be…

【Linux问题】删除用户时错把rm当成userdel删除后,该如何解决彻底删除?

问题引入:之前创建的用户默认在home目录中,过了段时间以为是一个目录就直接使用rm删除了,结果在创建一个和之前用户同名的用户时发现报错:useradd: user ‘cjs’ already exists(该用户已存在)。 1、问题 …

chatgpt赋能python:Python怎么找出最大数的位置?

Python怎么找出最大数的位置? Python是一种高级编程语言,它的简单易学和适用范围广泛使其成为了很多开发者的首选语言。在Python中,有许多方便的内置函数可以帮助我们轻松地处理各种任务。其中之一是查找最大值,但是我们如何找出…

【Linux后端服务器开发】shell脚本

目录 一、变量 1. 普通变量 2. 环境变量 3. 位置变量 4. 特殊变量 二、输入输出 1. read命令接收输入 2. echo命令输出字符串 三、表达式 1. 算术表达式 2. 逻辑表达式 四、分支控制 1. if 分支 2. case 分支 五、循环控制 1. for 循环 2. while 循环 3. unt…

redis键值对映射关系存储-Dict

基本概述 Redis是一个键值型(Key-Value Pair)的数据库,可以根据键实现快速的增删改查。而键与值的映射关系正是通过Dict来实现的。 Dict由三部分组成,分别是:哈希表(DictHashTable)、哈希节点&a…

基于51单片机设计的电动车控制器

一、项目介绍 随着社会经济的快速发展,人们对节能环保的要求越来越高,电动车因其无污染、噪音小、使用成本低等优点逐渐成为了市场关注的焦点。同时,随着科技的不断进步和应用,电动车的技术水平也在不断提高。 为了更好地满足市场需求和科技进步的要求,本项目基于51单片…

车载以太网 - 数据链路层 - VLAN

数据链路层通信 以太网二层数据链路层的寻址方式、帧结构、及 VLAN (Virtual LocalArea Network),其分为LLC(Logical Link Control)逻辑链路控制子层,和 MAC(Media Access Control)媒体访问控制子层,其中,MAC 子层负责以太网的总…

chatgpt赋能python:Python中的异常处理

Python中的异常处理 在Python编程中,异常是指程序出现了不正常的情况,比如语法错误、运行时错误等等。这些异常会导致程序崩溃,所以我们需要在程序中使用异常处理来避免这种情况的发生。 什么是异常处理? 异常处理是一种技术&a…

chatgpt赋能python:Python如何把多行合并成一行

Python如何把多行合并成一行 如果你常常需要处理文本数据,你就会遇到将多行文本合并成一行的需求。在Python中,这个任务非常简单,本文将介绍如何使用Python实现把多行合并成一行。 什么是多行文本? 在编程和文本处理中&#xf…

【MySQL高级篇笔记-其他数据库日志(下) 】

此笔记为尚硅谷MySQL高级篇部分内容 目录 一、MySQL支持的日志 1、日志类型 2、日志的弊端 二、慢查询日志(slow query log) 三、通用查询日志(general query log) 1、问题场景 2、查看当前状态 3、启动日志 方式 1 :永久性方式 方式2:临时性…

回归预测 | MATLAB实现基于LSTM-AdaBoost长短期记忆网络结合AdaBoost多输入单输出回归预测

回归预测 | MATLAB实现基于LSTM-AdaBoost长短期记忆网络结合AdaBoost多输入单输出回归预测 目录 回归预测 | MATLAB实现基于LSTM-AdaBoost长短期记忆网络结合AdaBoost多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现基于LSTM-Ad…

chatgpt赋能python:Python如何将多个图像合并输出?

Python如何将多个图像合并输出? 如果您需要将多个图像合并为一个,并将其输出到一个文件中,则Python提供了一些简单的解决方案。在本文中,我们将介绍如何使用Python进行该操作,并附上示例和用法说明。 PIL库 Python …

计算机图形学与opengl C++版 学习笔记 第11章 参数曲面

目录 11.1 二次贝塞尔曲线(三点)11.2 三次贝塞尔曲线(四点)11.3 二次贝塞尔曲面(3x3控制点)11.4 三次贝塞尔曲面(4x4控制点)补充说明 在20世纪50年代和60年代在雷诺公司工作期间,皮埃尔贝塞尔(Pierre Bzier)开发了用于设计汽车车身的软件系统…

【信息与内容安全复习】第二章知识要点总结

1.网络媒体信息的获取流程 2.三原色原理 3.颜色特征表达的特点、问题和主要方法 4.文本特征表达的方式 5.网络媒体信息与网络通讯信息 6.网络媒体信息获取方法 7.补充 8.视觉特征表达的应用 9.颜色特征表达举例之颜色直方图 10.纹理特征和局部特征 答: 1.网络媒体…

Redis从入门到精通【高阶篇】之底层数据结构字典(Dictionary)详解

文章目录 0.前言1. 字典的结构2. 源码解析2.1. 字典的结构体2.2. 字典的函数接口dictAdddictFinddictResize 3. 字典/哈希表的优缺点3.1 优点3.1.1. 快速的查找时间3.1.2. 动态调整大小3.1.3. 灵活的数据类型3.2 缺点 4.总结5. Redis从入门到精通系列文章 0.前言 上个篇章回顾…

java三大特性之【多态】

多态 1.1 概念1.2 实现条件1.3 方法重写(override)与方法重载(overload)1.4 向上转型1.5 向下转型 1.1 概念 同样的一个方法/行为,经过不同的对象,表现出不同的行为,这样的现象就称为多态。 举…