“open_clip”模块中的 CLIP 模型返回 77 个令牌的单个嵌入

问题描述 投票:0回答:1

我正在使用

open_clip
模块从 CLIP 模型中获取文本嵌入。当我标记单个文本序列的列表并将它们传递给模型的
encode_text
方法时,我期望获得形状为
[77, 1024]
的嵌入。但是,我得到的输出形状为
[1, 1024]

相关代码如下:

import open_clip

model, preprocess_train, preprocess_val = open_clip.create_model_and_transforms('hf-hub:laion/CLIP-ViT-H-14-laion2B-s32B-b79K')
tokenizer = open_clip.get_tokenizer('hf-hub:laion/CLIP-ViT-H-14-laion2B-s32B-b79K')

text_inputs = ["cat"]  
tokenized_inputs = tokenizer(text_inputs)
print(len(tokenized_inputs))  # This prints 77

text_embeddings = model.encode_text(tokenized_inputs)
print(text_embeddings.shape)  # This prints [1, 1024]

我在使用分词器或模型的

encode_text
方法时是否遗漏了某些内容?如何获取 77 个令牌序列中每个令牌序列的单独嵌入?我期待 [77, 1024]

text tokenize embedding
1个回答
0
投票

您想要的是池化层之前的输出,即序列中每个标记的嵌入,不幸的是,这不是通过调用 open_clip 类返回的。我建议的选项是

  • 导入您的代码并修改库的源代码,以获取计算过程中所需的任何内容
  • 将 OpenCLIP 检查点转换为 Transformer 库中可用的内容,然后您可以使用标准类。例如,使用 CLIPTextModel 您可以在
    output.last_hidden_state
    中访问所需的输出。您可以按照此脚本来执行此操作 https://gist.github.com/calpt/8e3555bd11f1916b5169c8125117e5ee

我也直接尝试过:

CLIPTextModel.from_pretrained("laion/CLIP-ViT-H-14-laion2B-s32B-b79K")

我还没有发现任何东西表明这是可行的(但我对此表示怀疑)。它加载了权重,但我想如果某些不匹配的东西被简单地忽略了。

© www.soinside.com 2019 - 2024. All rights reserved.