问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

CLIP网络结构解析:OpenAI的多模态预训练模型

创作时间:
作者:
@小白创作中心

CLIP网络结构解析:OpenAI的多模态预训练模型

引用
CSDN
1.
https://blog.csdn.net/qq_44442727/article/details/137335473

CLIP(Contrastive Language-Image Pre-training)是OpenAI提出的一种多模态网络,能够处理文本和图像信息。本文将对CLIP的网络结构进行解析,帮助读者更好地理解其工作原理。

1. 简单介绍

CLIP是OpenAI公司提出的网络,可以处理文本和图像,是一个多模态网络,对多模态的研究具有一定的推动作用。作为学习,记录一下对CLIP的理解。

clip的官方网站:
https://openai.com/research/clip

clip的GitHub网址:
https://github.com/openai/CLIP

2. 网络结构解析

CLIP的初始化函数包含视觉和文本相关的参数:

  • 视觉部分:图像分辨率、ResNet层数、通道宽度、补丁大小等
  • 文本部分:上下文长度、词汇量大小、Transformer宽度、头数、层数等

代码如下:

class CLIP(nn.Module):
    def __init__(self,
                 embed_dim: int,
                 # vision
                 image_resolution: int,
                 vision_layers: Union[Tuple[int, int, int, int], int],
                 vision_width: int,
                 vision_patch_size: int,
                 # text
                 context_length: int,
                 vocab_size: int,
                 transformer_width: int,
                 transformer_heads: int,
                 transformer_layers: int
                 ):
        super().__init__()

        self.context_length = context_length

        if isinstance(vision_layers, (tuple, list)):
            vision_heads = vision_width * 32 // 64
            self.visual = ModifiedResNet(
                layers=vision_layers,
                output_dim=embed_dim,
                heads=vision_heads,
                input_resolution=image_resolution,
                width=vision_width
            )
        else:
            vision_heads = vision_width // 64
            self.visual = VisionTransformer(
                input_resolution=image_resolution,
                patch_size=vision_patch_size,
                width=vision_width,
                layers=vision_layers,
                heads=vision_heads,
                output_dim=embed_dim
            )

从代码中可以看到,CLIP的初始化包含视觉(vision)和文本(text)两部分,分别对应图像输入和文本输入。

CLIP采用了两种图像处理结构:ModifiedResNet和VisionTransformer。其中,ResNet的输出采用QKV结构,因此网络中还单独定义了一个Transformer:

self.transformer = Transformer(
            width=transformer_width,
            layers=transformer_layers,
            heads=transformer_heads,
            attn_mask=self.build_attention_mask()
        )

3. 前向传播过程

CLIP的前向传播过程如下:

def forward(self, image, text):
        image_features = self.encode_image(image)
        text_features = self.encode_text(text)

        # normalized features
        image_features = image_features / image_features.norm(dim=1, keepdim=True)
        text_features = text_features / text_features.norm(dim=1, keepdim=True)

        # cosine similarity as logits
        logit_scale = self.logit_scale.exp()
        logits_per_image = logit_scale * image_features @ text_features.t()
        logits_per_text = logits_per_image.t()

        # shape = [global_batch_size, global_batch_size]
        return logits_per_image, logits_per_text
  • self.encode_image(image)self.encode_text(text) 分别对图像和文本进行编码
  • 对特征进行归一化处理
  • 使用余弦相似度计算图像特征和文本特征的相似性

从上述过程可以看出,CLIP模型通过对比学习的方式,将图像和文本特征进行关联,从而实现多模态信息的处理。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号