关于Phi-3-Vision模型图像Token占用与输入维度的技术咨询
Phi-3-Vision相关问题解答
1. 单张图像占用约2000Token是否正常?
这是正常现象,并非Bug。
你之前了解的VLM用CLIP映射为单个/少量Token的属于稀疏型图像编码策略,但Phi-3-Vision采用的是密集型视觉Token编码:它会将图像分割成大量视觉补丁(Patch),每个补丁对应一个Token,再和文本Token拼接输入模型。这类设计能保留更多图像细节,所以单张图像占用约2000Token是模型的预期行为。
2. 图像形状中的数字17来源于何处?
你看到的pixel_values: torch.Size([1, 17, 3, 336, 336])里的17,是Phi-3-Vision预设的多尺度图像分块总数。
模型采用多尺度编码策略,会将原始图像处理为不同分辨率的补丁集合,17包含了原始尺寸及多个下采样尺度的图像块组,目的是捕捉不同层级的视觉特征,这是模型架构设计的固定参数。
3. 仅传入一张图像,为何image_sizes的维度是(1, 2)而非(1, 1)?
image_sizes的维度(1,2)中:
- 第一个
1代表批量大小(batch size),即你传入的1张图像; - 第二个
2代表单张图像的宽度和高度两个维度的数值。
这个张量用于存储每张输入图像的原始尺寸信息,方便模型后续处理时做空间对齐,所以每张图像对应宽、高两个值,即使只传一张,维度也是(1,2),这是处理器统一批量处理格式的设计。
验证代码片段
from PIL import Image import requests from transformers import AutoProcessor model_id = "microsoft/Phi-3-vision-128k-instruct" processor = AutoProcessor.from_pretrained(model_id, trust_remote_code=True) messages = [ {"role": "user", "content": "<|image_1|>\nWhat is shown in this image?"}, ] url = "https://sm.ign.com/t/ign_ap/review/d/deadpool-r/deadpool-review_2s7s.1200.jpg" image = Image.open(requests.get(url, stream=True).raw) prompt = processor.tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True) inputs = processor(prompt, [image], return_tensors="pt") {k: v.shape for k, v in inputs.items()} # 输出: # {'input_ids': torch.Size([1, 2371]), # 'attention_mask': torch.Size([1, 2371]), # 'pixel_values': torch.Size([1, 17, 3, 336, 336]), # 'image_sizes': torch.Size([1, 2])}
内容的提问来源于stack exchange,提问作者sachinruk
相关产品推荐
相关产品推荐

