You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CLIP文本嵌入输入StableDiffusionPipeline时报解包值不足错误求助

解决Stable Diffusion使用CLIP文本嵌入生成图像的ValueError问题

问题描述

尝试用CLIP完成分词与嵌入操作,以文本嵌入而非原始文本作为输入生成图像,但运行代码时触发错误:

ValueError: not enough values to unpack (expected 3, got 2)

错误原因分析

  1. batch_size计算错误:代码中用len(text_input)获取批大小,但text_input是tokenizer返回的字典(包含input_ids、attention_mask等键),len(text_input)返回的是字典键的数量(通常为2),并非实际的样本批大小。
  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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 16:07:39