论文解读:CLIP探索笔记(Learning Transferable Visual Models From Natural Language Supervision Alec)

CLIP探索笔记(Learning Transferable Visual Models From Natural Language Supervision Alec)

记录CLIP的流水账,训练和推理是如何完成的?
每一次阅读都有不同的领悟和发现,一些简单的想法。

在这里插入图片描述

官方信息

相关的文章

它想干嘛?

他想做一个分类任务,一个模糊分类的任务;
他还可以做图文匹配等;

之前看过这篇论文,但是有些步骤或者工作原理没想明白,看到后面越来越迷糊,越来越困惑,所以进一步深挖。

训练阶段

  • Text Encoder不需要训练,直接拿现成的文本模型来用就可以了,比如GPT,提取文本特征

    • Text Encoder可以是Bert, GPT
    • 作者统一采用GPT-2里的Transformer结构; 对于base size model,使用63M-parameter 12-layer 512-width model with 8 attention heads; model width则随着image encoder的size增加而增加。 输入句子的最大长度为76。
  • Image Encoder需要训练,提取图片特征

    • Image Encoder模型可以是vgg,resnet,vit等
    • 代码中用的是CNN,resnet结构
  • 计算余弦相似度

    • 论文中给出了伪代码,文本特征和图像特征,分别和真实标签特征做相似度计算,然后再求平均
  • 对角线是正样本

在这里插入图片描述

重点来看一下,LOSS的计算

在这里插入图片描述
假设一个batch中共有N对<图像,文字>对,经过Text Encoder和Image Encoder 后,就会分别产生:

  • N条文字向量: [ T 1 T_1 T1, T 2 T_2 T2,…, T n T_n Tn], N条特征对应上图中红色矩形框,维度是(N=128,D=512), 注意 T 1 T_1 T1就对应一条文本的特征,维度是D=512或者768,
  • N张图片向量: [ I 1 I_1 I1, I 2 I_2 I2,…, I n I_n In],N张特征对应上图中绿色矩形框,维度是(N=128,D=512),注意 I 1 I_1 I1就对应一张图的特征,维度是D=512或者768, 与文本的特征维度一致

得到文本特征和图像特征后,我们要干什么事?

T 1 T_1 T1 I 1 I_1 I1描述的同一个事,一句文本,一张图经过一顿操作后,得到了两个维度相等的向量,然后我们期望是什么呢?

  1. T 1 T_1 T1 I 1 I_1 I1,这两个向量是相等,最大化相等,也就是相似度最大,值为1。
  2. 同时,期望图像 I 1 I_1 I1和其他的文本,不要相似,相似度值为0;
  3. 还有,期望文本 T 1 T_1 T1和其他图像,也不要相似,相似度值为0。

这样,根据上面的3条件,就可以去计算梯度了。

接下来看一下, 红色框和绿色框做点积运算,得到相似度矩阵,也就是上图中的橙色矩形框;论文中给出的伪代码,对Text Encoder和Image Encoder输出的向量,先做了归一化,再做点积求相似度, 整个过程也就是余弦相似度。

在橙色矩形框中,它就是N个文本和N张图像,两两的做相似度计算,什么意思呢?

  1. 按行计算loss的时候, 也就是拿一张图像,去和N个文本做相似度计算,找到相似度最大的,也就是期望蓝色小块,相似度值接近1,同时,其他的白色小块相似度值接近0。
  2. 按列计算loss的时候,也就是拿一条文本,去和N张图像做相似度计算,找到相似度最大的,也就是期望蓝色小块,相似度值接近1,同时,其他的白色小块相似度值接近0。

结合上面说的3个期望条件,我们希望一个训练CLIP模型(Text Encoder和Image Encoder),让他输出的橙色矩形框:

  1. 蓝色小块的值接近1
  2. 白色小块的值接近0

调试代码
在这里插入图片描述
similarity就是橙色矩形框,也就是相似度矩阵,维度是(128,128)。

往下看计算loss,本来思路很清晰,看到这里,迷糊了:

labels = np.arange(n)
loss_i = cross_entropy_loss(logits, labels, axis=0) 
loss_t = cross_entropy_loss(logits, labels, axis=1)

受分类loss的影响,绕不过来,是有n类嘛,可是这里没有分类的概念啊!
想了半天,原来这里的labels,不是类别标签, 而是制作GT标签,

labels = np.arange(n),做了one-hot后,对应GT标签,也就是橙色矩形框的GT标签类似这样

1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 0 1 

1为蓝色小块,0为白色小块,作为GT标签,不要往分类标签去想,和分类没半毛钱关系。
GT标签和预测值,按行,按列做交叉熵损失,相加求均值,就可以得到梯度反馈了。

下面是辅助理解的代码:
例子1:
矩阵乘法,也就是点积运算

import numpy as np
import torch

# numpy 矩阵乘法为 A@B 或 np.dot(A,B)
A = np.array([
    [1,2],
    [3,4]
])

B = np.array([
    [1,2],
    [3,4]
])

C1 = A @ B
C2 = np.dot(A,B)
print(C1)
print('---------')
print(C2)

# pytoch 矩阵乘法为 A@B 或 torch.matmul(A,B)
PA = torch.tensor(A)
PB = torch.tensor(B)
PC1 = PA @ PB
PC2 = torch.matmul(PA, PB)

print(PC1)
print('---------')
print(PC2)

例子2:
两个向量,做点积运算,

# A simple Example

batch_size = 4
dim = 256
embeddings = torch.randn(batch_size, dim)
out = embeddings @ embeddings.T
print(out)
print(F.softmax(out, dim=-1))

output:

tensor([[278.7493, -25.9693,  14.6406,   9.5813],
        [-25.9693, 237.4993,  25.0445,  -1.2630],
        [ 14.6406,  25.0445, 314.3572, -20.8825],
        [  9.5813,  -1.2630, -20.8825, 261.9082]])
tensor(
		[[1., 0., 0., 0.],
        [0., 1., 0., 0.],
        [0., 0., 1., 0.],
        [0., 0., 0., 1.]])

最后,拓展一下,你会发现什么问题?
假设在一个batch里面,出现2个相似的样本,loss收敛就会有问题,所以,一个batch里面的样本,最好是什么状态呢? 最好是都不相关的样本,两两之间不要相似,这样我们的loss梯度,working效果最好。

LOSS的计算,到这里就结束了。

推理阶段

  • 对一张图,给出预设文本提示(任意n个),预设答案n个
    • 预设的文本提示很重要,影响特征值对比
    • 文本的预测是模糊预测的,比如:一只猪 或 有一头猪,和之前的VGG,resnet直接输出label值不同;
    • 以前咱们是直接预测是猫或是狗,CLIP说 我们不这样干,不做精准的文本预测,我们考虑做相关性预测
  • 计算图像数据的特征
  • 计算图像特征和文本特征的相似度,相似度最高的就是答案

在这里插入图片描述

代码测试

Hugging Face

代码复现

Flickr30k图像标注数据集下载及使用方法

参考阅读

交流群

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/283e2cf1d2bd474da10cda7dce21c879.jpeg

在这里插入图片描述

标题“51单片机通过MPU6050-DMP获取姿态角例程”解析 “51单片机通过MPU6050-DMP获取姿态角例程”是一个基于51系列单片机(一种常见的8位微控制器)的程序示例,用于读取MPU6050传感器的数据,并通过其内置的数字运动处理器(DMP)计算设备的姿态角(如倾斜角度、旋转角度等)。MPU6050是一款集成三轴加速度计和三轴陀螺仪的六自由度传感器,广泛应用于运动控制和姿态检测领域。该例程利用MPU6050的DMP功能,由DMP处理复杂的运动学算法,例如姿态融合,将加速度计和陀螺仪的数据进行整合,从而提供稳定且实时的姿态估计,减轻主控MCU的计算负担。最终,姿态角数据通过LCD1602显示屏以字符形式可视化展示,为用户提供直观的反馈。 从标签“51单片机 6050”可知,该项目主要涉及51单片机和MPU6050传感器这两个关键硬件组件。51单片机基于8051内核,因编程简单、成本低而被广泛应用;MPU6050作为惯性测量单元(IMU),可测量设备的线性和角速度。文件名“51-DMP-NET”可能表示这是一个与51单片机及DMP相关的网络资源或代码库,其中可能包含C语言等适合51单片机的编程语言的源代码、配置文件、用户手册、示例程序,以及可能的调试工具或IDE项目文件。 实现该项目需以下步骤:首先是硬件连接,将51单片机与MPU6050通过I2C接口正确连接,同时将LCD1602连接到51单片机的串行数据线和控制线上;接着是初始化设置,配置51单片机的I/O端口,初始化I2C通信协议,设置MPU6050的工作模式和数据输出速率;然后是DMP配置,启用MPU6050的DMP功能,加载预编译的DMP固件,并设置DMP输出数据的中断;之后是数据读取,通过中断服务程序从DMP接收姿态角数据,数据通常以四元数或欧拉角形式呈现;再接着是数据显示,将姿态角数据转换为可读的度数格
MathorCup高校数学建模挑战赛是一项旨在提升学生数学应用、创新和团队协作能力的年度竞赛。参赛团队需在规定时间内解决实际问题,运用数学建模方法进行分析并提出解决方案。2021年第十一届比赛的D题就是一个典型例子。 MATLAB是解决这类问题的常用工具。它是一款强大的数值计算和编程软件,广泛应用于数学建模、数据分析和科学计算。MATLAB拥有丰富的函数库,涵盖线性代数、统计分析、优化算法、信号处理等多种数学操作,方便参赛者构建模型和实现算法。 在提供的文件列表中,有几个关键文件: d题论文(1).docx:这可能是参赛队伍对D题的解答报告,详细记录了他们对问题的理解、建模过程、求解方法和结果分析。 D_1.m、ratio.m、importfile.m、Untitled.m、changf.m、pailiezuhe.m、huitu.m:这些是MATLAB源代码文件,每个文件可能对应一个特定的计算步骤或功能。例如: D_1.m 可能是主要的建模代码; ratio.m 可能用于计算某种比例或比率; importfile.m 可能用于导入数据; Untitled.m 可能是未命名的脚本,包含临时或测试代码; changf.m 可能涉及函数变换; pailiezuhe.m 可能与矩阵的排列组合相关; huitu.m 可能用于绘制回路图或流程图。 matlab111.mat:这是一个MATLAB数据文件,存储了变量或矩阵等数据,可能用于后续计算或分析。 D-date.mat:这个文件可能包含与D题相关的特定日期数据,或是模拟过程中用到的时间序列数据。 从这些文件可以推测,参赛队伍可能利用MATLAB完成了数据预处理、模型构建、数值模拟和结果可视化等一系列工作。然而,具体的建模细节和解决方案需要查看解压后的文件内容才能深入了解。 在数学建模过程中,团队需深入理解问题本质,选择合适的数学模
以下是关于三种绘制云图或等高线图算法的介绍: 一、点距离反比插值算法 该算法的核心思想是基于已知数据点的值,计算未知点的值。它认为未知点的值与周围已知点的值相关,且这种关系与距离呈反比。即距离未知点越近的已知点,对未知点值的影响越大。具体来说,先确定未知点周围若干个已知数据点,计算这些已知点到未知点的距离,然后根据距离的倒数对已知点的值进行加权求和,最终得到未知点的值。这种方法简单直观,适用于数据点分布相对均匀的情况,能较好地反映数据在空间上的变化趋势。 二、双线性插值算法 这种算法主要用于处理二维数据的插值问题。它首先将数据点所在的区域划分为一个个小的矩形单元。当需要计算某个未知点的值时,先找到该点所在的矩形单元,然后利用矩形单元四个顶点的已知值进行插值计算。具体过程是先在矩形单元的一对对边上分别进行线性插值,得到两个中间值,再对这两个中间值进行线性插值,最终得到未知点的值。双线性插值能够较为平滑地过渡数据值,特别适合处理图像缩放、地理数据等二维场景中的插值问题,能有效避免插值结果出现明显的突变。 三、面距离反比 + 双线性插值算法 这是一种结合了面距离反比和双线性插值两种方法的算法。它既考虑了数据点所在平面区域对未知点值的影响,又利用了双线性插值的平滑特性。在计算未知点的值时,先根据面距离反比的思想,确定与未知点所在平面区域相关的已知数据点集合,这些点对该平面区域的值有较大影响。然后在这些已知点构成的区域内,采用双线性插值的方法进行进一步的插值计算。这种方法综合了两种算法的优点,既能够较好地反映数据在空间上的整体分布情况,又能保证插值结果的平滑性,适用于对插值精度和数据平滑性要求较高的复杂场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

且漫CN

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值