Advanced GANs: StyleGAN ແລະ VQ-GAN
ຈາກ ProGAN ເຖິງ VQ-GAN: ເສັ້ນທາງສູ່ຮູບຄົມຊັດລະດັບ HD.
ຫຼັງປີ 2017 GAN ພັດທະນາໄວຫຼາຍ: ProGAN ຝຶກຈາກຮູບນ້ອຍຂຶ້ນໄປຮູບໃຫຍ່, StyleGAN ໃຊ້ mapping network ສ້າງ style vector ທີ່ຄວບຄຸມລາຍລະອຽດແຕ່ລະລະດັບ, SAGAN ແລະ BigGAN ເພີ່ມ attention, ແລະ VQ-GAN ລວມ GAN ກັບ codebook ແລະ Transformer.
ໂຄດຕົວຢ່າງສະແດງຫົວໃຈຂອງ VQ: ປ່ຽນ vector ເປັນລະຫັດທີ່ໃກ້ທີ່ສຸດໃນ codebook ແລະ ໃຊ້ straight-through ໃຫ້ gradient ຜ່ານໄດ້.
| Model | ແນວຄິດໃໝ່ |
|---|---|
| ProGAN | ຝຶກແບບຄ່ອຍໆເພີ່ມຄວາມລະອຽດ 4×4 → 1024×1024 |
| StyleGAN / 2 | Mapping network + ໃສ່ style ໃນແຕ່ລະລະດັບ; v2 ໃຊ້ weight demodulation |
| SAGAN · BigGAN | Self-attention ຈັບຄວາມສຳພັນໄກໃນຮູບ, BigGAN ຂະຫຍາຍຂະໜາດ |
| VQ-GAN | Codebook ຂອງ "ຄຳສັບພາບ" + 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 ສ້າງຮູບໄດ້
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
- #ບອກຕໍ່ຄວາມຮູ້