Transformer中图像Embedding为浮点列表,文本Embedding为嵌套列表的原因
为什么Transformer的图像Embedding是浮点列表,文本Embedding是浮点嵌套列表?
这俩格式差异的核心原因是你在获取图像Embedding时手动提取了单个样本,而文本Embedding保留了批量维度。
图像Embedding的代码分析
batch_size = 1 inputs = processor(images=image, return_tensors="pt", padding=True) image_features = model.get_image_features(inputs.pixel_values)[batch_size-1] # 关键的索引操作 embeddings = image_features.numpy().astype(np.float32)
model.get_image_features原本返回的是形状为(batch_size, embedding_dim)的张量,你通过[batch_size-1](也就是[0])提取了批量中的第一个样本,直接去掉了外层的批量维度,最终得到一维的浮点列表。
文本Embedding的代码分析
inputs = tokenizer(text, return_tensors = "pt") text_embeddings = model.get_text_features(**inputs) embedding_as_np = text_embeddings.cpu().detach().numpy() embeddings = embedding_as_np.astype(np.float32)
这里model.get_text_features同样返回(batch_size, embedding_dim)的张量,但你没有做索引提取操作,直接转成numpy数组后保留了批量维度,所以变成了(1, embedding_dim)的二维数组,也就是你看到的“仅含一个元素的浮点嵌套列表”。
统一格式的方法
如果想让文本Embedding也变成一维浮点列表,只需要添加索引提取单个样本:
inputs = tokenizer(text, return_tensors = "pt") text_embeddings = model.get_text_features(**inputs)[0] # 提取第一个样本 embedding_as_np = text_embeddings.cpu().detach().numpy() embeddings = embedding_as_np.astype(np.float32)
反过来,要是想让图像Embedding保留嵌套格式,去掉索引操作即可。
内容的提问来源于stack exchange,提问作者Tiina
相关产品推荐
相关产品推荐

