在 Transformers 中使用 Chinese-CLIP:中文图文对比预训练模型的架构解析与跨模态检索实战指南
在 Transformers 中使用 Chinese-CLIP中文图文对比预训练模型的架构解析与跨模态检索实战指南【免费下载链接】transformers Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.项目地址: https://gitcode.com/GitHub_Trending/tra/transformersChinese-CLIP 是 CLIP 架构在中文图文数据上的落地实现它基于大规模中文图文对进行对比学习预训练同时可以承担图文跨模态检索、零样本图像分类、开放域目标检测的视觉骨干等任务。本文以 docs/source/en/model_doc/chinese_clip.md 为主线结合本仓库src/transformers/models/chinese_clip/目录下的真实源码与测试完整讲解模型架构、配置类字段、预处理流程、前向调用链与可运行的实战示例帮助你直接用transformers完成中文图文相似度计算、特征抽取与零样本分类。一、模型背景与核心思想Chinese-CLIP 出自论文Chinese CLIP: Contrastive Vision-Language Pretraining in Chinese作者An Yang, Junshu Pan, Junyang Lin, Rui Men, Yichang Zhang, Jingren Zhou, Chang Zhou由 OFA-Sys 团队贡献并集成进 Hugging Face Transformers模型于 2022-11-02 发布在 HF Papers2022-12-01 合入仓库。从论文摘要可以概括其技术要点构建了一个大规模中文图文对数据集大部分数据取自公开数据集并做中文适配训练了 5 个不同规模的中文 CLIP 模型参数量从7700 万到 9.58 亿不等提出两阶段预训练方法第一阶段冻结图像编码器、只训练文本侧与其他模块第二阶段放开全部参数联合优化以获得更好的模型性能实验表明它在MUGE、Flickr30K-CN、COCO-CN上的零样本zero-shot与微调finetuning评测中达到了当时的先进水平并在 ELEVATER 基准的零样本图像分类中表现有竞争力。与通用 CLIP 一样Chinese-CLIP 采用图文双塔 对比学习的范式图像编码器视觉 Transformer与文本编码器类 BERT Transformer分别将图像与文本映射到同一向量空间通过 InfoNCE 类对比损失拉近匹配图文对、推远不匹配图文对最终学习到的联合表征既能做跨模态检索也能作为视觉骨干迁移到下游视觉任务。二、架构总览双塔编码器与投影头Chinese-CLIP 的整体结构在 modeling_chinese_clip.py 中实现核心类为ChineseCLIPModel。在其__init__modeling_chinese_clip.py中可以清晰看到各部件self.text_model ChineseCLIPTextModel(self.config.text_config, add_pooling_layerFalse) self.vision_model ChineseCLIPVisionModel._from_config(vision_config) self.visual_projection nn.Linear(self.vision_embed_dim, self.projection_dim, biasFalse) self.text_projection nn.Linear(self.text_embed_dim, self.projection_dim, biasFalse) self.logit_scale nn.Parameter(torch.tensor(self.config.logit_scale_init_value))文本塔ChineseCLIPTextModel结构为ChineseCLIPTextEmbeddings词嵌入 位置嵌入 token type 嵌入ChineseCLIPTextEncoder多层ChineseCLIPTextLayer。模型类型为chinese_clip_text_model视觉塔ChineseCLIPVisionModel结构为ChineseCLIPVisionEmbeddingspatch 嵌入把patch_size × patch_size的图像块线性投影为向量并加位置编码 前置pre_layrnormChineseCLIPVisionEncoder 后置post_layernorm。模型类型为chinese_clip_vision_model投影头文本与视觉的编码维度不同通过两个无偏置线性层text_projection/visual_projection统一投影到共同的projection_dim默认 512 维可学习温度系数logit_scale初始值由配置logit_scale_init_value给出默认 2.6592接近ln(1/0.07)即 OpenAI CLIP 的经典初始温度在计算相似度时通过logit_scale.exp()对 logits 做缩放。从源码结构还可以看到该模型属于新一代“modular”代码生成体系modeling_chinese_clip.py头部注释明确指出它由 modular_chinese_clip.py 自动生成仓库 CI 会校验两者一致。如果你希望理解类之间的继承关系例如ChineseCLIPVisionModel复用了大量与 CLIP 相同的注意力层、MLP 层实现直接阅读 modular 文件会更友好。2.1 对比损失图文双向交叉熵在 modeling_chinese_clip.py 中定义了对比损失函数训练时传入return_lossTrue即可由前向过程返回损失def contrastive_loss(logits): return nn.functional.cross_entropy(logits, torch.arange(len(logits), devicelogits.device)) def image_text_contrastive_loss(similarity): caption_loss contrastive_loss(similarity) image_loss contrastive_loss(similarity.T) return (caption_loss image_loss) / 2.0即以当前 batch 内第i个样本自身为唯一正样本构造标签分别对“图→文”方向similarity与“文→图”方向similarity.T计算交叉熵并取平均。注意实现中使用了torch.pow/sum手写的 L2 范数计算_get_vector_norm这是为了让模型可被 executorch 导出。三、快速开始计算图文特征与相似度原文档给出了一段可直接运行的完整示例这里原样继承并逐步解释。它演示了三件事单张图片特征、多个文本特征、以及图片与候选文本之间的相似度打分import requests from PIL import Image from transformers import ChineseCLIPModel, ChineseCLIPProcessor model ChineseCLIPModel.from_pretrained(OFA-Sys/chinese-clip-vit-base-patch16, device_mapauto) processor ChineseCLIPProcessor.from_pretrained(OFA-Sys/chinese-clip-vit-base-patch16) url https://clip-cn-beijing.oss-cn-beijing.aliyuncs.com/pokemon.jpeg image Image.open(requests.get(url, streamTrue).raw) # Squirtle, Bulbasaur, Charmander, Pikachu in English texts [杰尼龟, 妙蛙种子, 小火龙, 皮卡丘] # compute image feature inputs processor(imagesimage, return_tensorspt).to(model.device) image_features model.get_image_features(**inputs) image_features image_features / image_features.norm(p2, dim-1, keepdimTrue) # normalize # compute text features inputs processor(texttexts, paddingTrue, return_tensorspt).to(model.device) text_features model.get_text_features(**inputs) text_features text_features / text_features.norm(p2, dim-1, keepdimTrue) # normalize # compute image-text similarity scores inputs processor(texttexts, imagesimage, return_tensorspt, paddingTrue).to(model.device) outputs model(**inputs) logits_per_image outputs.logits_per_image # this is the image-text similarity score probs logits_per_image.softmax(dim1) # probs: [[1.2686e-03, 5.4499e-02, 6.7968e-04, 9.4355e-01]]这段示例的运行要点如下Processor 负责多模态预处理ChineseCLIPProcessor会同时把文本分词、把图像缩放到模型输入尺寸并归一化。paddingTrue保证同一批内的多个文本长度对齐特征必须 L2 归一化get_image_features/get_text_features返回的是投影后的向量示例中手动除以 L2 范数。forward内部计算相似度前同样会对特征做归一化见 modeling_chinese_clip.py随后用logit_scale.exp()缩放得到 logits相似度打分方向logits_per_image形状为(batch_images, batch_texts)第i行第j列表示第i张图与第j条文本的相似度对dim1做 softmax 即可得到“该图属于哪个文本标签”的概率分布device_mapauto会把模型自动分配到可用设备需要安装accelerate。如果不需要多设备调度也可以去掉该参数或自行.to(cuda)文本既可以由示例中的processor(text...)处理也可以直接使用AutoTokenizer二者在本模型的 checkpoint 上是配套的。示例输出probs中“皮卡丘”的概率高达 0.94说明中文描述与图像内容正确对齐——这正是跨模态对比学习能力的直观体现。四、可直接加载的预训练权重当前仓库文档列出的、可经from_pretrained直接加载的中文 CLIP 预训练模型包括 4 个尺寸均以OFA-Sys/chinese-clip-vit-base-patch16这类模型 ID 传给ChineseCLIPModel/ChineseCLIPProcessor/AutoModel即可模型 ID 后缀说明OFA-Sys/chinese-clip-vit-base-patch16ViT-Base 骨干patch 尺寸 16基础规模推荐首选OFA-Sys/chinese-clip-vit-large-patch14ViT-Large 骨干patch 尺寸 14OFA-Sys/chinese-clip-vit-large-patch14-336pxViT-Large输入分辨率提升到 336pxOFA-Sys/chinese-clip-vit-huge-patch14ViT-Huge 骨干最大规模说明ChineseCLIPConfig等配置类中的默认值例如视觉patch_size32、image_size224是通用默认配置实际加载 checkpoint 时会以该 checkpoint 的config.json为准例如 base-patch16 的实际 patch 尺寸为 16。另外文档与源码 docstring 中同时出现openai/chinese_clip-vit-base-patch32这类用于示例的模型 ID按需选择即可。首次加载时transformers会从 Hugging Face Hub 下载权重与配置文件。五、配置类详解ChineseCLIPConfig 三件套配置类集中在 configuration_chinese_clip.pyChineseCLIPConfig组合型顶层配置model_type chinese_clip通过sub_configs声明子配置text_config与vision_config并持有跨模态共享参数ChineseCLIPTextConfigmodel_type chinese_clip_text_model文本塔配置对应base_config_key text_configChineseCLIPVisionConfigmodel_type chinese_clip_vision_model视觉塔配置对应base_config_key vision_config。5.1 ChineseCLIPTextConfig 关键字段与默认值字段默认值含义vocab_size30522文本词表大小hidden_size768隐层维度intermediate_size3072FFN 中间层维度num_hidden_layers12Transformer 层数num_attention_heads12注意力头数max_position_embeddings512最大序列长度hidden_actgelu文本侧激活函数layer_norm_eps1e-12LayerNorm 的 epsilonhidden_dropout_prob/attention_probs_dropout_prob0.1 / 0.1Dropout 概率pad_token_id/bos_token_id0 / 0填充符、起始符 token idtype_vocab_size2token_type_ids的词表大小支持句子对输入initializer_range/initializer_factor0.02 / 1.0参数初始化范围与缩放因子其中type_vocab_size的作用是支撑token_type_ids模型支持类似 BERT 的“句 A/句 B”分段标记这也是ChineseCLIPTextModel.forward接收token_type_ids入参的原因。配置类还通过validate_architecture校验hidden_size必须能被num_attention_heads整除。5.2 ChineseCLIPVisionConfig 关键字段与默认值字段默认值含义hidden_size768隐层维度intermediate_size3072FFN 中间层维度projection_dim512视觉塔内部投影/共同空间的维度设定num_hidden_layers/num_attention_heads12 / 12层数与注意力头数num_channels3图像通道数RGBimage_size224输入图像尺寸支持 int 或 (h, w)patch_size32图像 patch 尺寸支持 int 或 (h, w)hidden_actquick_gelu视觉侧激活函数QuickGELUlayer_norm_eps1e-5LayerNorm 的 epsilonattention_dropout0.0注意力 Dropoutinitializer_range/initializer_factor0.02 / 1.0初始化参数值得注意的是文本侧默认用gelu而视觉侧默认用quick_gelu这是对齐 OpenAI CLIP 原始视觉分支的实现细节。5.3 ChineseCLIPConfig组合与兼容顶层配置通过__post_init__完成子配置的装配configuration_chinese_clip.py若text_config/vision_config传None则自动用默认值创建对应子配置若传入的是配置对象或 dict则转换为统一的ChineseCLIPTextConfig/ChineseCLIPVisionConfig实例为了向后兼容仍支持历史上使用的text_config_dict/vision_config_dict关键字参数两者同时指定且值冲突时*_config_dict的值会覆盖并给出日志提示顶层还有两个跨模态参数projection_dim默认 512作为公共表征维度与logit_scale_init_value默认 2.6592决定可学习温度系数的初值。官方 docstring 给出了标准初始化与组合初始化两种方式from transformers import ChineseCLIPConfig, ChineseCLIPModel, ChineseCLIPTextConfig, ChineseCLIPVisionConfig # 方式一直接用默认值创建得到 base-patch16 风格的配置 configuration ChineseCLIPConfig() model ChineseCLIPModel(configuration) # 方式二分别构造文本/视觉配置后组合 config_text ChineseCLIPTextConfig() config_vision ChineseCLIPVisionConfig() config ChineseCLIPConfig(text_configconfig_text, vision_configconfig_vision)实际落地中通常不需要手工构造配置——直接ChineseCLIPConfig.from_pretrained(OFA-Sys/chinese-clip-vit-base-patch16)就能拿到完整子配置。六、图像预处理ChineseCLIPImageProcessor 与 PIL 版本Chinese-CLIP 提供了两个图像处理器ChineseCLIPImageProcessor基于 torchvision 后端的常规版本在 image_processing_chinese_clip.py 中实现ChineseCLIPImageProcessorPil基于 PIL 后端的轻量版本在 image_processing_pil_chinese_clip.py 中实现。二者均提供preprocess方法用于把原始图像转成模型输入张量。从源码字段可以看到ChineseCLIPImageProcessor的默认预处理管线image_processing_chinese_clip.py属性默认值含义resamplePILImageResampling.BICUBIC缩放时的重采样方式双三次插值image_mean/image_stdOPENAI_CLIP_MEAN/OPENAI_CLIP_STD像素归一化均值和方差沿用 OpenAI CLIP 的数值size{shortest_edge: 224}先按短边等比缩放到 224crop_size{height: 224, width: 224}随后中心裁剪到 224×224do_resize/do_center_cropTrue/True默认开启缩放与中心裁剪也就是说一条完整路径是解码图像 → BICUBIC 等比缩放短边到 224 → 中心裁剪 224×224 → 按 CLIP 均值/方差归一化。更大的 checkpoint如 336px 版本会通过各自的preprocessor_config.json覆盖这些尺寸默认值。而ChineseCLIPProcessor见 processing_chinese_clip.py作为ProcessorMixin子类构造函数接收image_processor与tokenizer两个组件把“图像预处理 中文文本分词”封装成单一入口processor(text..., images..., return_tensorspt, paddingTrue)会自动把两类输入编码到同一 batch这正是模型前向需要的输入格式。七、模型 API 与前向计算链路解析ChineseCLIPModel组合模型由三个直接入口组成仓库为每个入口在modeling_chinese_clip.py中都附带了可直接运行的 docstring 示例与单元测试见 tests/models/chinese_clip/test_modeling_chinese_clip.py、tests/models/chinese_clip/test_processing_chinese_clip.py、tests/models/chinese_clip/test_image_processing_chinese_clip.py。7.1 get_text_features抽取文本向量get_text_features(input_ids, attention_maskNone, token_type_idsNone, position_idsNone, **kwargs)modeling_chinese_clip.py内部流程由ChineseCLIPTextModel前向得到序列级隐状态last_hidden_state取序列第 0 个位置的 token 隐状态text_outputs.last_hidden_state[:, 0, :]经text_projection线性层投影到公共维度并写回pooler_output返回。需要说明由于ChineseCLIPModel构造文本塔时传入add_pooling_layerFalse这里组合模型自行完成了“取首位置向量 投影”的池化逻辑。抽取后示例代码还会手动做一次 L2 归一化以便直接计算余弦相似度。7.2 get_image_features抽取图像向量get_image_features(pixel_values, interpolate_pos_encodingFalse, **kwargs)modeling_chinese_clip.py调用ChineseCLIPVisionModel得到pooler_output该模型内部对 patch 序列的第 0 位做post_layernorm池化见 modeling_chinese_clip.py经visual_projection投影到公共维度并写回pooler_output。interpolate_pos_encoding参数用于在推理时给超过训练分辨率的图像做位置编码插值。7.3 forward一站式相似度打分forward(input_ids, pixel_values, attention_mask, token_type_ids, position_ids, return_lossNone, interpolate_pos_encodingFalse, ...)modeling_chinese_clip.py把整个流程串起来图像 - vision_model - visual_projection - image_embeds 文本 - text_model - text_projection - text_embeds image_embeds 与 text_embeds 各自做 L2 归一化 logits_per_text text_embeds image_embeds.T logits_per_text * logit_scale.exp() # 温度缩放 logits_per_image logits_per_text.T # 转置得到图→文方向的 logits 若 return_lossTrueloss image_text_contrastive_loss(logits_per_text)最终返回ChineseCLIPOutputmodeling_chinese_clip.py字段包括loss仅当return_lossTrue时非空logits_per_image/logits_per_text两个方向的相似度打分text_embeds/image_embeds归一化后的投影特征可直接用于向量检索或下游任务text_model_output/vision_model_output两塔各自的完整输出含last_hidden_state、pooler_output等。7.4 独立的单塔模型如果你只需要视觉表征或文本表征可以单独使用ChineseCLIPVisionModel输入pixel_values输出BaseModelOutputWithPoolingpooler_output为池化的 CLS 状态或ChineseCLIPTextModel输入input_ids等输出同样为BaseModelOutputWithPooling。仓库 docstring 中的最小示例为from transformers import AutoProcessor, ChineseCLIPVisionModel model ChineseCLIPVisionModel.from_pretrained(OFA-Sys/chinese-clip-vit-base-patch16) processor AutoProcessor.from_pretrained(OFA-Sys/chinese-clip-vit-base-patch16) inputs processor(imagesimage, return_tensorspt) outputs model(**inputs) last_hidden_state outputs.last_hidden_state pooled_output outputs.pooler_output八、实战延伸基于相似度的零样本分类既然logits_per_image.softmax(dim1)本身就是“图→候选文本标签”的概率分布那么把任意下游分类任务的候选类别翻译成中文标签就可以零样本分类无需任何训练。下面是在原文档示例基础上的一个通用化模板import requests import torch from PIL import Image from transformers import ChineseCLIPModel, ChineseCLIPProcessor model_id OFA-Sys/chinese-clip-vit-base-patch16 model ChineseCLIPModel.from_pretrained(model_id) processor ChineseCLIPProcessor.from_pretrained(model_id) # 1. 候选类别 - 中文文本模板零样本分类的标准做法 labels [猫, 狗, 鸟, 汽车] texts [f一张{label}的照片 for label in labels] # 2. 加载图像 url https://clip-cn-beijing.oss-cn-beijing.aliyuncs.com/pokemon.jpeg image Image.open(requests.get(url, streamTrue).raw) # 3. 打分并取概率 inputs processor(texttexts, imagesimage, return_tensorspt, paddingTrue) with torch.inference_mode(): logits_per_image model(**inputs).logits_per_image probs logits_per_image.softmax(dim1) print(dict(zip(labels, probs[0].tolist())))同样的思路可以扩展到图库检索计算一批图片特征与一批文本特征的内积矩阵取 top-k、图文排序或把ChineseCLIPModel的视觉塔当作骨干接入检测/分割等下游框架——这与论文中描述的“作为视觉骨干、支撑开放域目标检测”的定位一致。九、配套资源与自定义加载路径仓库内与 Chinese-CLIP 相关且值得继续阅读的文件包括configuration_chinese_clip.py三类配置的完整字段与组合逻辑modeling_chinese_clip.py双塔模型、投影头、对比损失与全部前向实现image_processing_chinese_clip.py 与 image_processing_pil_chinese_clip.pytorchvision 与 PIL 两种图像预处理后端processing_chinese_clip.py图文统一 Processorconvert_chinese_clip_original_pytorch_to_hf.py把 OFA-Sys 原始 PyTorch 权重转换为 HF 格式的转换脚本适合从原始 checkpoint 迁移自定义版本tests/models/chinese_clip/test_modeling_chinese_clip.py、tests/models/chinese_clip/test_processing_chinese_clip.py、tests/models/chinese_clip/test_image_processing_chinese_clip.py覆盖建模、Processor 与图像预处理的回归测试是理解各组件输入/输出契约的最佳参考。值得留意的是模型是模块化代码modular体系的一部分——若需追踪各子模块的定义源头请以 modular_chinese_clip.py 为准。需要说明的适用前提是以上所有from_pretrained用法都要求环境能访问 Hugging Face Hub 下载权重且device_mapauto、图像加载与多模态预处理分别依赖accelerate、Pillow、torchvision等依赖库安装完整版transformers通常即可满足默认路径。十、小结Chinese-CLIP 把 CLIP 的对比学习范式成功迁移到中文场景解决了中文图文跨模态表征缺失的问题。通过本文你可以掌握模型的“文本塔 视觉塔 双投影头 可学习温度”架构骨架、三个配置类的字段语义与组合方式、torchvision/PIL 两套图像预处理管线、get_image_features/get_text_features/forward三条前向路径各自的输入输出以及用一段代码完成图文相似度计算与零样本分类的完整套路。查阅本仓库对应源码即可对每个结论做进一步验证官方推荐的入口是加载OFA-Sys/chinese-clip-vit-base-patch16checkpoint 并参考上述 docstring 示例快速跑通。【免费下载链接】transformers Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.项目地址: https://gitcode.com/GitHub_Trending/tra/transformers创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考