只需几张照片,Stable Diffusion WebUI Forge 就能帮你炼出专属 Textual Inversion 概念令牌
【免费下载链接】stable-diffusion-webui-forge项目地址: https://gitcode.com/GitHub_Trending/st/stable-diffusion-webui-forge
Stable Diffusion WebUI Forge 的 Textual Inversion(文本嵌入)训练,让你不用碰模型权重,只用 5~20 张图就能把"你的风格 / 你的角色"变成一个专属词。训练完你会得到一个.pt小文件,往提示词里一写<my_style>,生成的每张图都带上这个概念。本文带你从建向量到出图,完整走一遍。
开始前的 3 件事
动手之前把这三件事搞定,后面一路顺:
- 环境:克隆仓库
git clone https://gitcode.com/GitHub_Trending/st/stable-diffusion-webui-forge,装好依赖后能正常启动 WebUI,并加载一张基础模型(SD1.5 / SDXL 均可,后文以常见参数为例)。 - 数据:建一个
dataset文件夹,放5~20 张训练图,统一裁成512×512。每张图配一句描述,例如a photo of [V] style,其中[V]是占位符,训练时会被你的嵌入名替换——这是整个方法的标准写法,别省。 - 概念速览:Textual Inversion 一句话解释——给模型词典里加一个新单词,再教它认识这个单词。模型本体权重一个字不动,只是多了一个可训练的小向量,训练完的嵌入就是那个向量。
手把手:从建模型到出图
1. 建一个初始向量
打开 WebUI 的Train标签页,在嵌入创建区填三项:
| 字段 | 怎么填 | 为什么 |
|---|---|---|
| 嵌入名称 | 如my_style,只用字母、数字、下划线 | 它就是提示词里的令牌名,特殊字符会被自动剔除 |
| 初始化文本 | 与目标相近的短语,如oil painting | 给向量一个靠谱的起点,收敛更快更稳 |
| 向量数 | 单一概念选 1,复杂风格选 4 | 向量越多容量越大,但更难训到位 |
界面入口在 modules/textual_inversion/ui.py,它最终调用 modules/textual_invector/textual_inversion.py 里的create_embedding(第 254 行):生成一个全零占位向量,若给了初始化文本,就把该文本经 CLIP 编码出的向量逐条拷进去,随后以[名称].pt落盘到embeddings/目录。核心只有几行:
vec = torch.zeros((num_vectors_per_token, embedded.shape[1]), device=devices.device) if init_text: for i in range(num_vectors_per_token): vec[i] = embedded[i * int(embedded.shape[0]) // num_vectors_per_token]2. 训练参数怎么填
创建完成后,训练参数区照这张表填,新手直接抄作业:
| 参数 | 建议值 | 一句话说明 |
|---|---|---|
| 学习率 | 0.005 | 初始值,后续不降就往下调 |
| 训练步数 | 1000~3000 | 按图片数量增减,宁少勿多 |
| 批次大小 | 1~4 | 跟着显存走,爆了就降到 1 |
| 梯度累积 | 4 | 显存不足时的"等效大批次"手段 |
实际训练由 modules/textual_inversion/textual_inversion.py 的train_embedding接管:读图、前向、更新那个向量、周期性存预览与进度,一气呵成。
3. 跑起来,盯着 loss
点Train Embedding。训练期间关注实时损失值:它应该逐步下滑,稳定后最好压在0.05 以下。中途停掉或正常跑完,.pt都会自动写回embeddings/目录——中断也不怕白跑。
4. 出图之后
在生成界面直接把令牌写进提示词:
a photo of <my_style> landscape with mountains出图满意?收工。不满意?分两种情况:
- 像,但没学到:样本太少或步数不够 → 补图(多角度、多光照),步数加到 2000 以上;
- 不像,像初始化文本了:说明初始化词带偏了 → 换一个更贴切的初始化短语重训,同时检查图片里光照、构图是否一致。
它到底在背后做了什么
跑完再回头拆原理,会清晰很多。
一个占位向量如何变成"单词"。create_embedding生成的.pt文件里存着 token 映射(string_to_token里*指向 token 265)、向量本体、名称、训练步数和所用检查点名。生成时,WebUI 在分词阶段把<my_style>换成这个占位 token,于是提示词里的它不再是普通文字,而是一个被训练过的向量。
谁负责加载与注册。modules/textual_inversion/textual_inversion.py 里的Embedding类(第 36 行)管理单个嵌入的向量、步数与哈希;EmbeddingDatabase类(第 108 行)则是"数据库",它会监控embeddings目录的变更,发现文件动了就自动重扫注册(load_textual_inversion_embeddings,第 205 行)——所以你把.pt拖进目录,不重启也能用。
一个文件兼容四种格式。load_from_file(第 154 行)按扩展名分发:
elif ext in ['.BIN', '.PT']: data = torch.load(path, map_location="cpu") elif ext in ['.SAFETENSORS']: data = safetensors.torch.load_file(path, device="cpu")除了.pt/.bin/.safetensors,还支持 PNG / WEBP / JXL / AVIF 图片——数据直接藏在图片元数据里(编码解码逻辑在 modules/textual_inversion/image_embedding.py)。好处是嵌入可以当图片转发,一眼看到长什么样,方便分享。
辅助工具。图片尺寸和焦点不一致会拖慢收敛,modules/textual_inversion/autocrop.py 的智能裁剪能把每张训练图规整成统一构图;想批量回归验证效果,可用 scripts/prompts_from_file.py 从文件读提示词批量出图。
调优与排错一本通
症状 → 原因 → 动作,按图索骥:
| 现象 | 多半是 | 该做的动作 |
|---|---|---|
| 显存爆了(OOM) | 批次开大了 | batch 降到 1、开梯度累积;关训练预览图;必要时启用 Low VRAM 模式 |
| loss 一直不降 | 学习率不对 | 先减半试 0.0025,再配合步数微调 |
| 生成结果不像描述 | 初始化文本带偏 | 换更贴切的初始化短语,重新创建向量 |
| 只认训练图、换个场景就崩 | 过拟合 | 减少训练步数、增加正则化(regularization)样本 |
| 概念和背景混在一起 | 训练图背景太杂 | 用 modules/textual_invector/autocrop.py 自动裁剪统一焦点,或手动抠图 |
| 临时文件占满磁盘 | 训练缓存未清 | 清理临时文件,如rm -rf tmp/* |
进阶玩法与方向
- 批量管理嵌入:
EmbeddingDatabase的扫描机制天然支持多嵌入共存,一次加载整目录; - 批量验证:配合 scripts/prompts_from_file.py,训练一版、批量出一组图做 A/B 对比;
- 和 LoRA 结合:嵌入是"加一个词",LoRA 是"改一摊权重"。想更精细地微调参数,可以看 packages_3rdparty/webui_lora_collection,两条路线可以叠加使用;
- 下一步探索:风格嵌入与物体嵌入混合训练(同一向量同时学"画风 + 角色")、给数据集做自动标注以降低人工成本。
现在就去
一套流程记住就行:几张图 + 一个下午 = 一个只属于你的概念令牌;训出来的.pt丢进任何一台 WebUI Forge 的embeddings/目录,别人也能直接用。打开 Train 标签页,创建你的第一个嵌入吧。
【免费下载链接】stable-diffusion-webui-forge项目地址: https://gitcode.com/GitHub_Trending/st/stable-diffusion-webui-forge
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考