我正在使用
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]
您想要的是池化层之前的输出,即序列中每个标记的嵌入,不幸的是,这不是通过调用 open_clip 类返回的。我建议的选项是
output.last_hidden_state
中访问所需的输出。您可以按照此脚本来执行此操作
https://gist.github.com/calpt/8e3555bd11f1916b5169c8125117e5ee我也直接尝试过:
CLIPTextModel.from_pretrained("laion/CLIP-ViT-H-14-laion2B-s32B-b79K")
我还没有发现任何东西表明这是可行的(但我对此表示怀疑)。它加载了权重,但我想如果某些不匹配的东西被简单地忽略了。