CLIP论文提炼与代码实战

ops/2024/12/14 2:53:51/

今天和大家分享一篇多模态的经典论文,大名鼎鼎的CLIP:Learning Transferable Visual Models From Natural Language Supervision[pdf]

文章目录

  • 一、论文提炼
  • 二、论文疑问
  • 三、代码演示CodeDemo

一、论文提炼

  • Source(来源): ICML2021
  • Summary: (文献方向归纳 )多模态大模型
  • Motivate :消除多模态之间的障碍, 无监督和零样本学习,跨模态的通用型
  • Method:论文提出了一种通过对比学习的方式,将图像和文本嵌入到共同的向量空间中,从而实现跨模态的任务,如图像分类、文本生成等,且不依赖于特定的数据集标签。
  • 数据格式:从互联网上收集的4亿个文本图像对
  • 训练方式: 使用文本编码器和图像编码器分别编码文本和图像对,文本编码器使用Transformer或者bert,图像编码器使用Vit或者Resnet。假设一个Batch里面有N个图像文本对,那么编码之后一共可以产生个N2个正负样本对,其中正样本有N个,负样本有N2-N个。Clip的训练目标就是让正负样本之间的差距变大,采用的方式是对比学习的方式。

对比学习:CLIP 将图像和文本嵌入到一个共享的向量空间中,使得对应的图像和文本在这个空间中的向量表示尽可能相似,而不对应的图像和文本尽可能远离。 CLIP使用了对比损失,具体来说就是InfoNCE损失,对比损失的形式是:

其中,I是图像Image嵌入,T是文本Text的文本嵌入,Sim(I,T)是图像和文本之间的相似度,t是温度参数( 通常设置为一个较小的值(如 0.07),用于平衡正负样本之间的相对重要性),N是 训练批次的样本数量 。

二、论文疑问

  • Clip不是用的文本图片对进行学习的吗?这不是一种有监督训练吗?
    虽然 CLIP 使用图像和文本对来进行训练,这些图像-文本对可以被视为“标签”,但它与传统监督学习中的标签有所不同。CLIP 的“标签”是通过图像和文本的自然配对关系生成的,而不是人工标注的类别标签。CLIP 的训练方法侧重于通过对比学习来优化图像和文本的相似度,而不是依赖于人工预先定义的类别标签。因此,它被称为无需传统标签数据的模型,并且在处理未见过的类别时也能表现出色(零样本学习)。

  • Clip是怎么做到跨模态对齐的?

    • 共享嵌入空间:CLIP 将图像和文本映射到同一个嵌入空间中,这意味着两种模态的表示可以直接比较和计算相似度。这种做法使得 CLIP 不依赖于传统的手工设计的标签或者类别。
    • 自然语言描述:CLIP 的训练数据是从互联网上的大量图像和其自动生成的文本描述(如标题、说明等)中获得的。这些描述不需要人工标注,因此 CLIP 能够在没有显式标签的情况下通过图像-文本对学习到跨模态的关系。
    • 零样本学习能力:通过对比学习,CLIP 学会了将图像和文本映射到共享的嵌入空间中,因此可以通过文本描述直接查询图像,即使这些图像没有出现在训练集中。这样,CLIP 实现了跨模态的零样本学习,即可以处理在训练阶段从未见过的类别。

三、代码演示CodeDemo

首先在虚拟环境中安装需要的依赖库:

pip install ftfy regex tqdm
pip install git+https://github.com/openai/CLIP.git

测试代码:

import torch
import clip
from PIL import Image
device = "cuda" if torch.cuda.is_available() else "cpu"
model, preprocess = clip.load("ViT-B/32", device=device)
image = preprocess(Image.open("image.png")).unsqueeze(0).to(device)
label = ["一只老虎", "一只狗", "一只猫","一只拖鞋","一幅画","一件衣服"]
text = clip.tokenize(label).to(device)with torch.no_grad():image_features = model.encode_image(image)text_features = model.encode_text(text)logits_per_image, logits_per_text = model(image, text)probs = logits_per_image.softmax(dim=-1).cpu().numpy()
# 得到标签
print("Label probabilities:", probs)
print("Label:", label[probs.argmax()])

在这里插入图片描述

Label probabilities: [[0.1523  0.15    0.02448 0.11145 0.0046  0.557  ]]
Label: 一件衣服

http://www.ppmy.cn/ops/141696.html

相关文章

VS2019 + Linux 跨平台开发中的 sqlite3 数据库环境配置

Visual Studio 2019 + Linux 跨平台开发中的 sqlite3 数据库环境配置 参考文章链接:Sqlite3环境配置(Windows和Linux) 源码资源下载:SQLite Download Page把源码.tar.gz包复制到Ubuntu下(/opt/Sqlite3/),并新建一个文件夹(/root/sqlite3_build)作为等会配置输出的文件…

力扣题目 - 2931.购买物品的最大开销

题目 还需要你前往力扣官网查看详细的题目要求 地址 思路 这边需要你去力扣官网详细查看题目看了题目提供的示例 已经有了解法, 先把values转成1维数组,排序之后进行累加即可 代码 var maxSpending function (values) {let list values.flat();list.sort((a, b) > a - …

JAVA数据结构

1.数组 (Array): 固定大小的容器,用于存储相同类型的元素,数组在内存中是连续存储的,支持通过索引快 速访问元素。 int[] numbers = new int[10]; numbers[0] = 1;2.Java Collections Framework (JCF) JCF提供了一组接口和类用于管理和操作集合(如列表,集合,…

Docker 学习总结(84)—— Docker 常用运维命令

版本与信息查询 docker --version:查看安装的Docker版本。 docker info:获取Docker系统的详细配置信息。 镜像管理 docker images:列出本地所有镜像。 docker search IMAGE_NAME:搜索Docker Hub上的镜像。 docker pull IMAGE_NAME[:TAG]:从仓库下载指定镜像。 docker rmi …

网络知识:IP数据报知识详解

目录 一、IP数据报概念 二、IPV4数据报报头组成 三、IPV6数据报报头组成 今天给大家分享IP数据库相关的知识,希望对大家进一步了解IP协议提供一些帮助! 一、IP数据报概念 TCP/IP协议的网际层接收到传输层传递过来的数据单元,封装成向下(OSI模型的数据链路层、TCP/IP协…

Spring Security OAuth2内置的服务提供者

Spring Security 5.7.5版本,接入OAuth2登录后需要在配置文件中进行相关配置。如果是框架内置的服务提供者,则配置文件中只需要配置client-id, client-secret即可。那么框架内置了哪些服务提供者呢? 直接上源码: GOOGLE {Overridep…

Springboot计算机毕业设计基于web的旅游社交分享系统95j7i

Springboot计算机毕业设计基于web的旅游社交分享系统95j7i 本系统(程序**源码数据库调试部署开发环境)带论文文档1****万字以上,文末可获取,系统界面在最后面。** 系统程序文件列表 项目功能: 用户,分享心得,视频专…

云原生后端详解

云原生后端(Cloud-Native Backend)是指在云计算环境中,利用云原生技术(如容器、微服务、服务网格等)构建和部署后端应用程序的一种方法。以下是对云原生后端的详细解释: 一、云原生后端的核心技术 容器技术…