采样步数扫一遍:1 到 8 步 PSNR 从 8.83 冲到 24.40(涨 15.57 dB),8 到 16 只涨 1.87 dB, 32 到 64 只涨 0.61 dB。 这就是「步数收益递减」:时间线性涨,画质对数涨。
上一节把 LoRA 部署好了。 这一节真正出图,重点不在「怎么写提示词」,而在那几个必须自己定的参数。
一、文生图的四个参数
① 提示词(正面 + 负面)。正面写「要什么」,负面写「不要什么」。这是唯一决定内容的东西。
② 采样步数与采样器。 步数决定「画多少遍」,采样器决定「每遍怎么走」。
常用 20 到 30 步,采样器用 DPM++ 2M Karras 这类收敛快的。
③ 种子。 决定随机初始噪声。同一个种子加同一套参数,出图完全一样。
④ LoRA 权重。 一般 0.6 到 1.0 起步,写法是 <lora:名字:0.8>。它决定「这个 LoRA 掺多浓」。
四个参数里,提示词是内容、LoRA 权重是风格浓度,这两个是创作;
步数和种子是工程,它们不该成为变量——调参时先把它们固定住。
二、步数:收益递减,而且是对数式的
Demo 用一个「逐步逼近目标图 + 每步加噪」的过程模拟采样,量每个步数下的 PSNR:
| 采样步数 | 与目标的 PSNR |
|---|---|
| 1 | 8.83 dB |
| 2 | 12.28 dB |
| 4 | 18.46 dB |
| 8 | 24.40 dB |
| 16 | 26.28 dB |
| 32 | 27.14 dB |
| 64 | 27.75 dB |
| 前 8 步涨了 15.57 dB,后面 56 步加起来只涨 3.35 dB。换算成倍数更直观: | |
| 8 到 16 翻一倍步数涨 1.87 dB,32 到 64 再翻一倍只涨 0.61 dB。 | |
| 这就是为什么实际出图用 20 到 30 步:再往上加一倍,肉眼几乎看不出差别,时间却实打实翻倍。 | |
注意噪声有个「地板」——Demo 里是 floor=0.03。 |
|
| 所以曲线不会无限涨,它会撞上一条水平线。真实采样的噪声地板来自采样器本身的离散误差, | |
| 这也是「加步数救不回来的那部分」的来源。 |
三、种子:可复现的前提
同种子跑两次,逐像素最大差 0.000000——完全一致。 换个种子(7 改 8),平均差 0.0548,构图会变。 这两句话是调参纪律的基础:改提示词之前先固定种子。不然你改了提示词, 出图变好——你分不清是提示词的功劳还是种子的运气。 复现别人的图需要三样: 同一个底模、同一个 LoRA(含权重哈希)、同一个种子和采样器。 缺一样都复现不出来。 反过来说, 分享参数时这三样都要给全。只给提示词和步数是没用的——别人拿同样的提示词,也出不来你那张图。
四、LoRA 权重与提示词写法
权重从 0.6 到 1.0 起步,先试 0.8。太低(低于 0.4)风格出不来;
太高(超过 1.2)会出现「过拟合味」——线条变硬、颜色发脏、细节糊成一团。
触发词放提示词最前面。
顺序在 SD 里是有权重的(越靠前越重),所以「触发词 + 主体 + 风格词 + 质量词」是常用顺序。
负面提示词别偷懒:lowres, bad anatomy, worst quality, text, watermark 这一套基本通用,
尤其 watermark(水印)——训练集里的水印会被学进去。
📋 实操清单(在文生图页里做):
第一步,提示词框写 mystyle, 1girl, portrait, <lora:my_style:0.8>。
第二步,步数填 25,采样器选 DPM++ 2M Karras。
第三步,种子填 -1(随机),先出一批八张。
第四步,挑中一张,把它的种子抄下来,再开始调权重和提示词。
最后一条经验:一次只改一个参数。同时改提示词和权重,出图变好你也不知道该记哪个。
这跟做实验是一个道理。
五、动手 Demo:出图参数:8 步到 24.4 dB,再翻倍只涨 1.9 dB
用「每步向目标靠拢一点、同时加一点噪声」的过程模拟采样,噪声带一个不随步数衰减的地板项, 量 1 到 64 步各档的 PSNR;再固定步数,比较同种子两次和换种子两次的差异。
def run(steps, seed, floor=0.03, extra=0.06):
r = np.random.default_rng(seed)
x = r.normal(0.5, 0.25, (n, n)).astype(np.float32)
for i in range(steps):
s = floor + extra * (1.0 - i / float(steps)) # 噪声有地板
x = x + eta * (target - x) + r.normal(0, s, (n, n))
return x
def psnr(a, b):
mse = float(np.mean((a - b) ** 2))
return 10.0 * np.log10(1.0 / max(mse, 1e-12))
实跑输出:
--------------------------------------------------------------------
出图参数:8 步到 24.4 dB,再翻倍只涨 1.9 dB
--------------------------------------------------------------------
采样步数 与目标的 PSNR
-----------------------
1 8.83 dB
2 12.28 dB
4 18.46 dB
8 24.40 dB
16 26.28 dB
32 27.14 dB
64 27.75 dB
步数从 1 加到 8,PSNR 从 8.83 冲到 24.40,八步之内涨了 15.57 dB。
这就是「步数收益递减」,再往上每翻一倍只多这么一点:
**8 到 16 涨 1.87 dB,16 到 32 涨 0.86 dB,32 到 64 只涨 0.61 dB。**
真实出图也是这个形状:**20 到 30 步**是常用区间,再往上加一倍,
肉眼几乎看不出差别,时间却翻倍。
再看种子:同种子跑两次,逐像素最大差 **0.000000**——完全一致,这就是「可复现」。
换个种子(7 改 8),平均差 **0.0548**——**构图会变。**
所以调参时一定要先 **固定种子**:不然你改了提示词出图变好,分不清是提示词的功劳还是种子的运气。
要复现别人的图,需要三样:
**同一个底模、同一个 LoRA(含权重哈希)、同一个种子和采样器**。
缺一样都复现不出来。
done -> _out_39k.txt
表格七行:8.83 → 12.28 → 18.46 → 24.40 → 26.28 → 27.14 → 27.75。八步之内涨了 15.57 dB,
剩下 56 步加起来只涨 3.35 dB。
原因在 s = floor + extra * (1 - i/steps) 这一行:噪声随步数线性衰减,
但永远降不到 0,它停在 floor 上。所以再怎么加步数,误差也下不去——曲线必然撞平。
这个「地板」不是我为了凑结论硬加的:
真实采样的离散误差、VAE 的重建损失、模型的容量上限,都是这种不随步数消失的项。
没有地板的话 PSNR 会一路涨到 50 dB 以上,那反而是假的(相当于假设加无限步就能完美重建)。
种子那段:同种子两次最大差 0.000000(真的一致),换种子平均差 0.0548。
前者说明可复现,后者说明种子真的是个变量。
要说明:这里用 PSNR 代替人眼判断。
PSNR 与人眼感受不是线性关系——26 dB 和 27.75 dB 的差别,人眼可能完全看不出来,但 PSNR 还在涨。
所以「多少步够」最终还是要人看,数字只用来判断趋势。
30 秒实验
- 把 eta 从 0.35 改到 0.2,看 8 步的 PSNR 掉到多少。 每步走得少,就要更多步才到位——这就是采样器的「收敛速度」。
- 把 floor 从 0.03 加到 0.15,看 64 步的上限掉到多少。地板变高,整条曲线整体下移并更早压平。
- 用三个种子各跑 16 步,算两两的平均差。 三个数都不为 0 且量级相近——说明种子的影响是稳定存在的,不是偶然。
常见误区
- 「步数越多越好」。20 到 30 步之后肉眼几乎无差别,时间却线性涨。
- 「调提示词不用固定种子」。不固定就分不清是提示词的功劳还是种子的运气,一次只改一个参数。
- 「LoRA 权重拉满最像」。超过 1.2 会出现过拟合味:线条硬、颜色脏、细节糊。
自测三问(点开对答案)
1. 常用的采样步数区间是多少?为什么? —— 20 到 30 步。步数的收益是对数式的,翻倍步数只涨不到 1 dB,时间却翻倍。 2. 复现别人一张图需要哪三样? —— 同一个底模、同一个 LoRA(含权重哈希)、同一个种子和采样器。 3. LoRA 权重怎么定? —— 0.6 到 1.0 起步(先试 0.8)。低于 0.4 风格出不来,高于 1.2 会出现线条硬、颜色脏的过拟合味。第七章到这里结束:从低秩近似的原理,到装环境、备数据、打标签、写配置,再到部署和出图, 一条完整的图像训练链路走完了。第八章换一个模态——让模型学说话。
- ☐ (本章完,下一节 8.1.1 认识与登录weights平台)