没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
博客 下载 学习 社区 知道 GitCode InsCode 会议
学习
搜索 登录 会员中⼼
登录后您可以享受以下权益:
https://blog.csdn.net/weixin_44791964/article/details/129941386 2024/7/28 02:34
⻚码 1/21
多模态模型学习1——CLIP对⽐学习 语⾔-图像预训练模型
阅读量3.2w 收藏 645 点赞数 149
多模态模型学习 ⽂章标签: 学习 机器学习 深度学习
已于!2023-04-05 15:14:19!修改
GitCode 开源社区
⽂章已被社区收录
多模态 模型学习1——CLIP对⽐学习 语⾔-图像预训练模型
学习前⾔
什么是CLIP模型
代码下载
CLIP实现思路
⼀、⽹络结构介绍
1、Image Encoder
a、Patch+Position Embedding
b、Transformer Encoder
I、Self-attention结构解析
II、Self-attention的矩阵运算
III、MultiHead多头注意⼒机制
IV、TransformerBlock的构建。
c、整个VIT模型的构建
2、Text Encoder
⼆、训练部分
训练⾃⼰的CLIP模型
⼀、数据集的准备
⼆、数据集的格式
三、开始⽹络训练
四、训练结果预测
学习前⾔
学了⼀些多模态的知识, CLIP 算是其中最重要也是最通⽤的⼀环,⼀起来看⼀下吧。
什么是CLIP模型
CLIP的全称是Contrastive Language-Image Pre-Training,中⽂是对⽐语⾔-图像 预训练 ,是⼀个预训练模型,简称为CLIP。
该模型是 OpenAI 在 2021 年发布的,最初⽤于匹配图像和⽂本的预训练神经⽹络模型,这个任务在多模态领域⽐较常⻅,可以⽤于⽂本图像检索,CLIP是近年来在多模态研究领域的经典之作。该模型⼤量的成对互联⽹
数据进⾏预训练,在很多任务表现上达到了⽬前最佳表现(SOTA) 。
专栏收录该内容
Bubbliiiing
关注
149 645 68
登录后您可以享受以下权益:
免费复制代码
下载海量资源
⽴即登录
https://blog.csdn.net/weixin_44791964/article/details/129941386 2024/7/28 02:34
⻚码 2/21
CLIP的思想⾮常简单,只需要看懂这幅图就可以了,左边是训练的原理,CLIP⼀共有两个模态,⼀个是⽂本模态,⼀个是视觉模态,分别对应了Text Encoder和Image Encoder。
Text Encoder⽤于对⽂本进⾏编码,获得其Embedding;
Image Encoder⽤于对图⽚编码,获得其Embedding。
两个Embedding均为⼀定⻓度的单⼀向量。
在训练时,假设⼀个批次中有64个⽂本图像对,此时我们会同时获得64个图⽚和64个⽂本,⾸先我们从64个⽂本图像对中取出⼀个⽂本图像对,成对的⽂本图像对是天然的正样本,它们是配对的。
⽽对于这个样本的⽂本来讲,其它63个图像都为负样本,它们是不配对的。
⽽对于这个样本的图像来讲,其它63个⽂本都为负样本,它们是不配对的。
在这个批次中,64个⽂本图像对,可以获得的图像embedding和⽂本embedding为:
visual_embedding的第x⾏和text_embedding的第x⾏是成对的。
我们使⽤visual_embedding 叉乘 text_embedding,得到⼀个[64, 64]的矩阵,那么对⻆线上的值便是成对特征内积得到的,如果visual_embedding和对应的text_embedding越相似,那么它的值便越⼤。
我们选取[64, 64]矩阵中的第⼀⾏,代表第1个图⽚与64个⽂本的相似程度,其中第1个⽂本是正样本,我们将这⼀⾏的标签设置为1,那么我们就可以使⽤交叉熵进⾏训练,尽量把第1个图⽚和第⼀个⽂本的
内积变得更⼤,那么它们就越相似。
每⼀⾏都做同样的⼯作,那么[64, 64]的矩阵,它的标签就是[1,2,3,4,5,6……,64],在计算机中,标签从0开始,所以实际标签为[0,1,2,3,4,5……,63]。
代码下载
Github源码下载地址为:
https://github.com/bubbliiiing/clip-pytorch
复制该路径到地址栏跳转。
CLIP实现思路
⼀、⽹络结构介绍
1、Image Encoder
visual_embedding [64, embedding_size]
text_embedding [64, embedding_size]
https://blog.csdn.net/weixin_44791964/article/details/129941386 2024/7/28 02:34
⻚码 3/21
a、Patch+Position Embedding
Patch+Position Embedding的作⽤主要是对输⼊进来的图⽚进⾏分块处理,每隔⼀定的区域⼤⼩划分图⽚块。然后将划分后的图⽚块组合成序列。
该部分⾸先对输⼊进来的图⽚进⾏分块处理,处理⽅式其实很简单,使⽤的是现成的卷积。由于卷积使⽤的是滑动窗⼝的思想,我们只需要设定特定的步⻓,就可以输⼊进来的图⽚进⾏分块处理了。
在VIT中,我们常设置这个卷积的卷积核⼤⼩为16x16,步⻓也为16x16,此时卷积就会每隔16个像素点进⾏⼀次特征提取,由于卷积核⼤⼩为16x16,两个图⽚区域的特征提取过程就不会有重叠。当我们输⼊的图
⽚是224, 224, 3的时候,我们可以获得⼀个14, 14, 768的特征层。
下⼀步就是将这个特征层组合成序列,组合的⽅式⾮常简单,就是将⾼宽维度进⾏平铺,14, 14, 768在⾼宽维度平铺后,获得⼀个196, 768的特征层。平铺完成后,我们会在图⽚序列中添加上Cls Token,该To ken
会作为⼀个单位的序列信息⼀起进⾏特征提取,图中的这个0*就是Cls Token,我们此时获得⼀个197, 768的特征层。
https://blog.csdn.net/weixin_44791964/article/details/129941386 2024/7/28 02:34
⻚码 4/21
添加完成Cls Token后,再为所有特征添加上位置信息,这样⽹络才有区分不同区域的能⼒。添加⽅式其实也⾮常简单,我们⽣成⼀个197, 768的参数矩阵,这个参数矩阵是可训练的,把这个矩阵加上197, 768的特
征层即可。
到这⾥,Patch+Position Embedding就构建完成了,构建代码如下:
b、Transformer Encoder
class VisionTransformer(nn.Module):
def __init__(self, input_resolution: int, patch_size: int, width: int, layers: int, heads: int, output_dim: int):
super().__init__()
self.input_resolution = input_resolution
self.output_dim = output_dim
#-----------------------------------------------#
# 224, 224, 3 -> 196, 768
#-----------------------------------------------#
self.conv1 = nn.Conv2d(in_channels=3, out_channels=width, kernel_size=patch_size, stride=patch_size, bias=False)
scale = width ** -0.5
#--------------------------------------------------------------------------------------------------------------------#
# class_embedding
部分是
transformer
的分类特征。⽤于堆叠到序列化后的图⽚特征中,作为⼀个单位的序列特征进⾏特征提取。
#
#
在利⽤步⻓为
16x16
的卷积将输⼊图⽚划分成
14x14
的部分后,将
14x14
部分的特征平铺,⼀幅图⽚会存在序列⻓度为
196
的特征。
https://blog.csdn.net/weixin_44791964/article/details/129941386 2024/7/28 02:34
⻚码 5/21
剩余20页未读,继续阅读
资源评论
刘伊诺
- 粉丝: 0
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功