CLIP文本嵌入输入StableDiffusionPipeline时报解包值不足错误求助
解决Stable Diffusion使用CLIP文本嵌入生成图像的ValueError问题
问题描述
尝试用CLIP完成分词与嵌入操作,以文本嵌入而非原始文本作为输入生成图像,但运行代码时触发错误:
ValueError: not enough values to unpack (expected 3, got 2)
错误原因分析
- batch_size计算错误:代码中用
len(text_input)获取批大小,但text_input是tokenizer返回的字典(包含input_ids、attention_mask等键),len(text_input)返回的是字典键的数量(通常为2),并非实际的样本批大小。 - CLIP输出使用不当:Stable Diffusion的
prompt_embeds参数需要的是文本编码器的最后隐藏层输出(形状为[batch_size, seq_len, hidden_size]),若嵌入形状不匹配,会导致管道内部处理时出现解包错误。
修正后的代码
from transformers import AutoTokenizer, CLIPTextModelWithProjection from diffusers import StableDiffusionPipeline import torch # 加载CLIP模型与分词器 model = CLIPTextModelWithProjection.from_pretrained("openai/clip-vit-base-patch32") tokenizer = AutoTokenizer.from_pretrained("openai/clip-vit-base-patch32") # 加载Stable Diffusion模型 path = "path_to_my_model.safetensors" pipe = StableDiffusionPipeline.from_single_file( path, torch_dtype=torch.float16, use_safetensors=True, variant="fp16" ) pipe.to("cuda") prompt = "some random prompt" # 处理prompt,获取文本输入并移至cuda text_input = tokenizer( prompt, padding="max_length", max_length=tokenizer.model_max_length, truncation=True, return_tensors="pt" ).to("cuda") # 获取CLIP的最后隐藏层输出(Stable Diffusion所需的序列嵌入) text_embeddings = model(**text_input).last_hidden_state batch_size = text_input.input_ids.shape[0] # 正确获取批大小 # 处理无条件嵌入 uncond_input = tokenizer( [""] * batch_size, padding="max_length", max_length=tokenizer.model_max_length, truncation=True, return_tensors="pt" ).to("cuda") uncond_embeddings = model(**uncond_input).last_hidden_state # 拼接无条件与条件嵌入,形状应为[2, 77, 768](对应clip-vit-base-patch32) text_embeddings = torch.cat([uncond_embeddings, text_embeddings]) # 生成并保存图像 output_image = pipe(prompt_embeds=text_embeddings).images[0] output_image.save("generated_image.png")
关键修正点
- 正确计算batch_size:通过
text_input.input_ids.shape[0]获取实际样本数量,避免用字典长度错误计算批大小。 - 明确获取CLIP输出:使用
model(**text_input).last_hidden_state直接获取最后隐藏层输出,确保嵌入形状符合Stable Diffusion要求。 - 设备对齐:将tokenizer输出移至cuda,与模型设备保持一致,避免张量设备不匹配问题。
内容的提问来源于stack exchange,提问作者Felox
相关产品推荐
相关产品推荐

