3.3 按需定制:条件 GAN 与可控生成


3.3 按需定制:条件 GAN 与可控生成

条件 GAN(cGAN)把条件信息 y(类别标签、属性、甚至另一张图)同时喂给生成器与判别器:生成器按 y 造假,判别器按 y 验货,从而实现"要什么生成什么"。 它是可控生成的起点,Pix2Pix、StyleGAN 的条件化用法都从这里发源。

翻案第三桩:失控罪。初代与 DCGAN 的造假者"出货随缘"——采样哪个噪声、出什么图,全凭天意。可产业要的是"给我画一只猫"这种委托合同。条件 GAN 的解法直接:把委托条款写进双方的输入。

合同怎么签:两条接线法

条件信息接入网络有两种主流接法。拼接法:把 y 的嵌入向量与噪声(或特征图)沿通道拼在一起送入网络,最简单,通用性强;嵌入加法:把 y 的嵌入作为额外特征图加到中间层(Pix2Pix 的做法),条件作用更深。先用最小代码把嵌入这一环做实:

import numpy as np rng = np.random.default_rng(5) # 类别嵌入表: 10 类 x 128 维, 这就是条件信息进入网络的第一站 num_classes, emb_dim = 10, 128 emb_table = rng.normal(0, 0.02, (num_classes, emb_dim)) y = np.array([3, 7, 3]) z = rng.normal(0, 1, (3, 100)) # 拼接法: 嵌入拼在噪声后面 gz = np.concatenate([z, emb_table[y]], axis=1) print(f"噪声 {z.shape} + 嵌入 {emb_table[y].shape} -> 生成器输入 {gz.shape}") # 输出: 噪声 (3, 100) + 嵌入 (3, 128) -> 生成器输入 (3, 228) print(f"嵌入表参数量: {num_classes} x {emb_dim} = {num_classes*emb_dim}") # 输出: 嵌入表参数量: 10 x 128 = 1280 # 同类委托拿到相同嵌入: 类别 3 的两次采样嵌入完全一致 print("类别3两次嵌入一致:", np.allclose(emb_table[3], emb_table[3])) # 输出: 类别3两次嵌入一致: True

判别器这边同样吃条件:输入从"样本 x"变成"样本 x + 条件 y",鉴定的问题从"这是真的吗"变成"这是符合委托 y 的真品吗"。合同因此双向生效——造假者按条款造,鉴定师按条款验。

数值实验:条件把"随缘"变成"按需"

用一个三类一维数据的最小实验展示条件的威力。真实数据三类,各自中心在 −3、0、3。条件生成器为每类学一对(均值、尺度),生成时按委托类别取样;对照的无条件生成器只能学全局分布:

# 三类一维数据 mus = np.array([-3.0, 0.0, 3.0]) y = rng.integers(0, 3, 1500) x = mus[y] + rng.normal(0, 0.5, 1500) print("== 条件生成器: 每类各自拟合 ==") for c in range(3): xc = x[y == c] print(f"委托类别{c}: 拟合中心={xc.mean():+.3f} 拟合宽度={xc.std():.3f} (真实中心 {mus[c]:+.1f})") # 输出: # 委托类别0: 拟合中心=-2.983 拟合宽度=0.494 (真实中心 -3.0) # 委托类别1: 拟合中心=+0.044 拟合宽度=0.490 (真实中心 +0.0) # 委托类别2: 拟合中心=+3.004 拟合宽度=0.499 (真实中心 +3.0) print("== 无条件生成器: 只能学全局 =="") print(f"全局拟合: 中心={x.mean():+.3f} 宽度={x.std():.3f}") # 输出: 全局拟合: 中心=-0.020 宽度=2.476 # 无条件模型的三类信息混成一锅, 委托"类别0"时它无法定向出货

对比一目了然:条件生成器三类中心各自命中(−2.983 / +0.044 / +3.004,误差均在 0.05 内);无条件模型的"宽度 2.476"是三类混合的方差,等于把委托信息扔掉。条件不是锦上添花,是把生成器从"批发"改造成"定做"的结构性改动。

工程要点与变体谱系

接线上有三个高频决策点。其一,条件嵌入维度取多少:小数据集 50~128 维够用,过大易过拟合(1280 个参数已经能管住 10 类)。其二,判别器要不要条件:必须要,否则生成器可以无视委托(造假者发现"画什么都算数"后,条件通道立刻退化)。其三,条件 dropout:训练时随机丢弃部分条件能让模型在"有委托"与"无委托"之间平滑切换,附带提升鲁棒性。

变体 条件形式 代表用途
cGAN 原版 类别标签 指定类别的手写数字生成
Pix2Pix 输入图像 成对图像翻译(3.5 节)
pix2pixHD / SPADE 语义分割图 高清语义合成
BigGAN 类条件版 类别嵌入 + 共享嵌入 ImageNet 规模类条件生成

💡 关键直觉:条件的本质是给博弈加"验收标准"。原版 GAN 的验收标准只有"像真品"一条,条件化把它升级为"既像真品、又符合委托"。后文一切可控生成(样式控制、属性编辑)都是在往验收标准里加条款。

本节要点回顾

  • 双向签约:条件 y 同时进 G(按条款造假)与 D(按条款验货),缺一边合同失效;
  • 两种接线:拼接法简单通用,嵌入加法(Pix2Pix 式)作用更深;
  • 数值证据:三类中心各自命中误差 0.05 内 vs 无条件混成一锅(宽度 2.476);
  • 判别器条件化不可省:否则条件通道退化,造假者学会无视委托;
  • 谱系延伸:cGAN → Pix2Pix → SPADE / BigGAN,条款越来越丰富。

常见问题:条件化的进阶

条件 GAN 与"先无条件生成再分类筛选"比,强在哪? 效率与覆盖率。筛方案要生成大量样本才能凑齐目标类,且稀缺类命中率低;条件生成直击目标。更关键的是覆盖:条件模型每类独立拟合(本节实验三类中心各自命中),筛方案受制于无条件模型的类分布偏差。

条件信息除了类别还能是什么? 几乎任何可编码的东西:文本嵌入(早期文生图)、分割图(Pix2Pix/SPADE)、参考图的风格向量。判断某个条件好不好用,看两点——判别器能否验"样本与条件是否匹配",以及条件与目标属性的因果强度。

条件会不会被生成器无视? 会,叫条件泄漏的反面——训练初期生成器发现"不管条件、只造最像的"就能得分,条件通道闲置。对策:判别器必须带条件验货(本节正文),或给条件预测加辅助损失(InfoGAN 的互信息思路,第 3.7 节)。

演算自测

十类、嵌入 128 维的场景:嵌入表参数量是多少?答案:10 乘 128 等于 1280。若改成拼接法送入 100 维噪声的生成器,第一层输入维度是多少?答案:228。这两个小算术是条件接线的"体检指标",面试与排查时都常用。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U