程序员学长 | 快速学习一个算法,CLIP

news2024/9/23 19:22:17

本文来源公众号“程序员学长”,仅用于学术分享,侵权删,干货满满。

原文链接:快速学习一个算法,CLIP

今天给大家介绍一个强大的算法模型,CLIP。

CLIP (Contrastive Language–Image Pre-training) 是一个由 OpenAI 开发的多模态预训练模型,它能够理解图像和相关文本之间的关系。

CLIP 的核心思想是通过对比学习(Contrastive Learning)训练一个模型,使其能够将图像和描述性文本映射到同一个向量空间中。

CLIP 模型的主要意义在于其跨模态学习能力,即能同时处理和理解图像及其文本描述。这种能力使得 CLIP 在处理视觉任务时不局限于固定的数据集和预定义的类别,而是能够理解在训练时未曾见过的概念或对象。

此外,CLIP 可以使用自然语言描述来进行零样本学习(zero-shot learning),即直接使用文本描述来进行图像识别,而不需要额外的模型训练。

零样本学习(zero-shot learning)是指模型尝试预测在训练数据中未出现过一次的类别。

例如,经过对狗和猫进行分类训练的图像分类器有望在我们赋予它的任务上表现出色,即对狗和猫进行分类。我们通常不会期望经过对狗和猫进行训练的机器学习模型能够很好地检测浣熊。而 CLIP 往往在它们没有直接接受过训练的任务上表现良好,这被称为 “零样本学习”。

CLIP 架构

CLIP 模型包括两个主要的组成部分:一个图像编码器和一个文本编码器,这两者共同工作来将图像和文本映射到一个共同的特征空间中。

  1. 图像编码器

    通常使用卷积神经网络(CNN)或 Vision Transformer(ViT)架构。这些编码器被训练来处理图像数据,提取重要的视觉特征。

  2. 文本编码器
    通常基于 Transformer 架构,设计用于处理文本数据。这些编码器被训练来处理文本数据,提取重要的文本特征。

两个编码器都输出嵌入向量(即高维特征表示),这些向量随后通过对比损失函数进行优化,确保图像与其相应的文本描述在特征空间中彼此接近,而与不相关文本的距离则较远。通过这种方式,CLIP 学习如何将图像和文本对齐到同一特征空间,实现跨模态的理解和处理。

假设给定一批 N 个图像和相应的文本描述,会生成 N*N 个图像和文本对,在这些对中,N 对应该具有较高的余弦相似度,而其余 N²-N 个不正确的配对应该具有较低的余弦相似度。

首先,我们通过图像编码器(ViT 或 ResNet 模型)以获取尺寸为 NxI 的图像嵌入。将文本通过文本编码器以获取尺寸为 NxT 的文本嵌入。

为了测量它们在表示上的相似性,我们希望对图像的嵌入和相应的文本的嵌入进行点积。但这两个向量分别是 I 维和 T 维。为了使它们达到相同的维度,我们引入了两个投影(线性)层,一个用于图像,一个用于文本,使它们达到相同的维度 D。经过投影层后,我们将得到两个形状为 NxD 的矩阵。

接下来,将两个矩阵相乘,从而得到一个 BxB 矩阵,其中行表示图像,列表示文本,其值代表了图像(embedding)与文本(embedding)的相似性。

CLIP 损失函数

对于像我这样还没有尝试过对比损失的人来说,这是最有趣的部分。

我们知道,我们希望相应图像和文本的向量对齐。这意味着点积必须尽可能接近(矩阵中的对角线元素) 1。对于其他所有内容,我们需要将其推向 0。

因此,对于给定的标题,我们对所有图像的点积取 softmax,然后取交叉熵损失。

同样,对于给定的图像,我们对所有标题重复该过程。

接下来,我们对这两个损失取平均值。然后我们通过反向传播来更新权重。这就是 CLIP 的构建和训练方式。

代码解析

def contrastive_loss(logits, dim):
    neg_ce = torch.diag(F.log_softmax(logits, dim=dim))
    return -neg_ce.mean()
    
def clip_loss(similarity: torch.Tensor) -> torch.Tensor:
    caption_loss = contrastive_loss(similarity, dim=0)
    image_loss = contrastive_loss(similarity, dim=1)
    return (caption_loss + image_loss) / 2.0

def metrics(similarity: torch.Tensor) -> Tuple[torch.Tensor, torch.Tensor]:
    y = torch.arange(len(similarity)).to(similarity.device)
    img2cap_match_idx = similarity.argmax(dim=1)
    cap2img_match_idx = similarity.argmax(dim=0)

    img_acc = (img2cap_match_idx == y).float().mean()
    cap_acc = (cap2img_match_idx == y).float().mean()

    return img_acc, cap_acc

应用实例

由于 CLIP 模型具有理解图像与文本的能力,使其在多种应用场景中表现出色。

以下是一些主要的应用例子。

  • 零样本图像分类

    在没有训练特定类别的情况下识别图像中的对象。

  • 图像搜索

    CLIP 可以用来实现基于文本的图像检索。

  • 多模态内容生成

    CLIP 可以与图像生成模型(如DALL·E)结合,根据文本描述生成具体的图像。

下面,我们来看一下 clip 如何进行零样本图像分类。

首先,我们将所有单词插入上下文(提示)并将其传递给文本编码器。接下来,使用余弦相似度公式(简单点积)将所有相应的嵌入与图像嵌入进行比较。最后,我们选择点积最大的文本。

THE END !

文章结束,感谢阅读。您的点赞,收藏,评论是我继续更新的动力。大家有推荐的公众号可以评论区留言,共同学习,一起进步。

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

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

相关文章

机器学习流程图

第一部分:课程使用的技术栈 (1)Numpy 科学计算基础库,矩阵运算,线性代数 (2)matplotlib 绘图库,数据可视化 (3)Scikit 封装了各种分类,回归…

【课程总结】day19(下):Transformer源码深入理解

前言 在上一章【课程总结】day19(下):Transformer架构及注意力机制了解总结中,我们对Transformer架构以及注意力机制有了初步了解,本章将结合《The Annotated Transformer》中的源码,对Transformer的架构进行深入理解。 背景 《The Annotated Transformer》是由 Harva…

LaneATT推理详解及部署实现(上)

目录 前言1. 概述2. 环境配置3. Demo测试4. ONNX导出初探5. ONNX导出优化6. ONNX导出总结结语下载链接参考 前言 最近想关注下车道线检测任务,在 GitHub 上找了一个模型 LaneATT,想通过调试分析 LaneATT 代码把 LaneATT 模型导出来,并在 tens…

Java游戏源码:象棋网络对战版

学习java朋友们,福利来了,今天小编给大家带来了一款象棋网络对战版源码。 源码搭建和讲解 源码分为客户端和服务器,采用java原生 java.net.Socket 实现,服务器主循环代码: import java.net.ServerSocket; import jav…

二维码生成原理及解码原理

☝☝☝二维码配图 二维码 二维码(Quick Response Code,简称QR码)是一种广泛使用的二维条形码技术,由日本公司Denso Wave在1994年开发。二维码能有效地存储和传递信息,广泛应用于商品追溯、支付、广告等多个领域。二维…

Star-CCM+负体积网格检查与出现原因

要使网格可用于有限体积计算,每个网格单元必须具有正体积,否则初始化过程将失败,且模拟计算无法运行。 负体积网格单元可能会以多种不同的方式出现,但必须修复或从网格中移除,才能继续执行任何后续操作。 要检查体网…

<数据集>人员摔倒识别数据集<目标检测>

数据集格式:VOCYOLO格式 图片数量:8605张 标注数量(xml文件个数):8605 标注数量(txt文件个数):8605 标注类别数:1 标注类别名称:[fall] 序号类别名称图片数框数1fall860512275 使用标注工具&#xf…

当前生物信息学研究面临的四大机遇和挑战(特别是最后一个,一定要足够重视)...

生物信息学是应用计算方法分析生物数据,如 DNA,RNA,蛋白质和代谢物。生物信息学已成为促进我们对生命科学的理解以及开发新的诊断,治疗和生物技术产品的重要工具。本文我们将探讨生物信息学研究的一些当前趋势和发展,以…

如何快速入门 PyTorch ?

PyTorch是一个机器学习框架,主要依靠深度神经网络,目前已迅速成为机器学习领域中最可靠的框架之一。 PyTorch 的大部分基础代码源于 Ronan Collobert 等人 在 2007 年发起的 Torch7 项目,该项目源于 Yann LeCun 和 Leon Bottou 首创的编程语…

【C++题解】1249. 搬砖问题

欢迎关注本专栏《C从零基础到信奥赛入门级(CSP-J)》 问题:1249. 搬砖问题 类型:嵌套穷举 题目描述: 36 块砖, 36 人搬。男搬 4 ,女搬 3 ,两个小儿抬一砖。 要求一次全搬完。问需…

GitHub最全中文排行榜开源项目,助你轻松发现优质资源!

文章目录 GitHub-Chinese-Top-Charts:中文开发者的开源项目精选项目介绍项目特点核心功能1. 热门项目榜单2. 详细项目信息 如何使用覆盖范围软件类资料类 GitHub-Chinese-Top-Charts:中文开发者的开源项目精选 在全球范围内,GitHub已经成为了…

谷歌外链:提升网站权重的秘密武器!

谷歌外链之被称为提升网站权重的秘密武器,主要是因为它们对网站的搜索引擎排名有着直接且显著的影响 谷歌和其他搜索引擎使用外链作为衡量网站信任度和权威性的重要指标。当一个网站获得来自其他信誉良好的源的链接时,这被视为信任的投票。多个高质量链…

opencv-图像仿射变换

仿射变换就是将矩形变为平行四边形,而透视变换可以变成任意不规则四边形。实际上,仿射变换是透视变换的子集,仿射变换是线性变换,而透视变换不仅仅是线性变换。 仿射变换设计图像位置角度的变化,是深度学习预处理中常…

力扣SQL50 患某种疾病的患者 正则表达式

Problem: 1527. 患某种疾病的患者 在SQL查询中,REGEXP 是用于执行正则表达式匹配的操作符。正则表达式允许使用特殊字符和模式来匹配字符串中的特定文本。具体到你的查询,^DIAB1|\\sDIAB1 是一个正则表达式,它使用了一些特殊的通配符和符号。…

Vue:vue-router使用指南

一、简介 点击查看vue-router官网 Vue Router 是 Vue.js 的官方路由。它与 Vue.js 核心深度集成,让用 Vue.js 构建单页应用变得轻而易举。功能包括: 嵌套路由映射动态路由选择模块化、基于组件的路由配置-路由参数、查询、通配符-展示由 Vue.js 的过渡系…

DNS常见面试题

DNS是什么? 域名使用字符串来代替 IP 地址,方便用户记忆,本质上一个名字空间系统;DNS 是一个树状的分布式查询系统,但为了提高查询效率,外围有多级的缓存;DNS 就像是我们现实世界里的电话本、查…

电路板热仿真覆铜率,功率,结温,热阻率信息计算获取方法总结

🏡《电子元器件学习目录》 目录 1,概述2,覆铜率3,功率4,器件尺寸5,结温6,热阻1,概述 电路板热仿真操作是一个复杂且细致的过程,旨在评估和优化电路板内部的热分布及温度变化,以确保电子元件的可靠性和性能。本文简述在进行电路板的热仿真时,元器件热信息的计算方法…

59.DevecoStudio项目引入不同目录的文件进行函数调用

59.DevecoStudio ArkUI项目引入不同目录的文件进行函数调用 arkUi,ets,cj文件,ts文件的引用 import common from ohos.app.ability.common; import stringutils from ./uint8array2string; //index.ts的当前目录 import StringUtils2 from ../http2/uint8array2st…

python全栈开发《23.字符串的find与index函数》

1.补充说明上文 python全栈开发《22.字符串的startswith和endswith函数》 endswith和startswith也可以对完整(整体)的字符串进行判断。 info.endswith(this is a string example!!)或info.startswith(this is a string example!!)相当于bool(info this …

鸿蒙媒体开发【拼图】拍照和图片

拼图 介绍 该示例通过ohos.multimedia.image和ohos.file.photoAccessHelper接口实现获取图片,以及图片裁剪分割的功能。 效果预览 使用说明: 使用预置相机拍照后启动应用,应用首页会读取设备内的图片文件并展示获取到的第一个图片&#x…