Ainsteinx Logo
Ainsteinx
👤
欢迎使用 Ainsteinx
登录

切换语言

货币

首页
博客
服务
第 10 课 · 应用

进阶 GAN:StyleGAN 与 VQ-GAN

从 ProGAN 到 VQ-GAN:通往高清图像之路。

2017 年后 GAN 发展迅速:ProGAN 从小图逐步训练到大图;StyleGAN 用映射网络生成风格向量,控制各个分辨率的细节;SAGAN 和 BigGAN 加入注意力;VQ-GAN 则把 GAN 与码本和 Transformer 结合起来。

示例展示 VQ 的核心:把每个向量替换为码本中最近的条目,并用直通(straight-through)技巧让梯度照样能传回去。

模型新思路
ProGAN从 4×4 渐进增长到 1024×1024
StyleGAN / 2映射网络 + 各分辨率注入风格;v2 使用权重解调
SAGAN · BigGAN自注意力捕捉远距离结构;BigGAN 扩大规模
VQ-GAN“视觉词汇”码本 + 生成编码序列的 Transformer
z_q = codebook[ argminₖ ‖z − eₖ‖ ] loss = ‖sg[z] − z_q‖² + β·‖z − sg[z_q]‖² (sg = stop-gradient) z_q_st = z + sg[z_q − z] (straight-through)

要点

  • StyleGAN 把“整体特征”和“细节”分开,因此可以控制图像
  • VQ 把图像变成 token,于是可以用 Transformer 生成图像
generative-ai-ep10-advanced-gans.py
import torch

torch.manual_seed(0)
codebook = torch.randn(16, 4, requires_grad=True)   # 16 learnable "visual words"
z = torch.randn(6, 4, requires_grad=True)            # encoder outputs for 6 image patches

# Quantize: replace each vector by its nearest codebook entry
idx = torch.cdist(z, codebook).argmin(1)
zq = codebook[idx]
codebook_loss = ((zq - z.detach()) ** 2).mean()      # move codes toward encoder outputs
commit_loss = ((z - zq.detach()) ** 2).mean()        # keep encoder close to its code
zq_st = z + (zq - z).detach()                        # straight-through: gradients skip argmin

(zq_st.sum() + codebook_loss + 0.25 * commit_loss).backward()
print("code indices:", idx.tolist())
print("encoder gets gradients:", z.grad is not None)
print("codebook gets gradients:", codebook.grad.abs().sum().item() > 0)

输出结果

code indices: [12, 10, 9, 7, 4, 2]
encoder gets gradients: True
codebook gets gradients: True
  • #GenerativeAI
  • #DeepLearning
  • #PythonສຳລັບຄົນLaos
  • #AI
  • #ບອກຕໍ່ຄວາມຮູ້