Chapter 36
GANs
GANs
🎬 দুই খেলোয়াড়ের খেলা
Generative Adversarial Network (Goodfellow, 2014) — Generator নকল ডেটা বানায়, Discriminator আসল-নকল চেনে। দুজনে প্রতিযোগিতা করতে করতে Generator এমন বাস্তব ডেটা বানায় যা প্রায় আসল।
মিনিম্যাক্স অবজেক্টিভ
min_G max_D E[log D(x)] + E[log(1 - D(G(z)))]
x ~ আসল ডেটা
z ~ noise (latent)Generator vs Discriminator
Generator (G)
Discriminator (D)
z (noise) → image
image → real/fake probability
Upsampling, ConvTranspose
Conv + pooling
Goal: D-কে ফাঁকি দেওয়া
Goal: G-কে ধরা
সরল DCGAN — PyTorch
import torch, torch.nn as nn
class G(nn.Module):
def __init__(self, z=100):
super().__init__()
self.net = nn.Sequential(
nn.ConvTranspose2d(z, 256, 4, 1, 0), nn.BatchNorm2d(256), nn.ReLU(),
nn.ConvTranspose2d(256, 128, 4, 2, 1), nn.BatchNorm2d(128), nn.ReLU(),
nn.ConvTranspose2d(128, 64, 4, 2, 1), nn.BatchNorm2d(64), nn.ReLU(),
nn.ConvTranspose2d(64, 1, 4, 2, 1), nn.Tanh(),
)
def forward(self, z): return self.net(z)
class D(nn.Module):
def __init__(self):
super().__init__()
self.net = nn.Sequential(
nn.Conv2d(1, 64, 4, 2, 1), nn.LeakyReLU(0.2),
nn.Conv2d(64, 128, 4, 2, 1), nn.BatchNorm2d(128), nn.LeakyReLU(0.2),
nn.Conv2d(128, 256, 4, 2, 1), nn.BatchNorm2d(256), nn.LeakyReLU(0.2),
nn.Conv2d(256, 1, 4, 1, 0), nn.Sigmoid(),
)
def forward(self, x): return self.net(x).view(-1)Training Loop
for x, _ in loader:
# ----- D -----
z = torch.randn(B, 100, 1, 1, device=dev)
fake = G(z).detach()
loss_d = bce(D(x), ones) + bce(D(fake), zeros)
opt_d.zero_grad(); loss_d.backward(); opt_d.step()
# ----- G -----
z = torch.randn(B, 100, 1, 1, device=dev)
loss_g = bce(D(G(z)), ones) # G চায় D তাকে real ভাবুক
opt_g.zero_grad(); loss_g.backward(); opt_g.step()সাধারণ সমস্যা ও সমাধান
- Mode collapse: G একইরকম sample বানায় → mini-batch discrimination, WGAN।
- Training instability: learning rate ছোট, Adam β1=0.5।
- Vanishing D gradient: WGAN-GP, spectral norm।
- Evaluation কঠিন: FID, IS metric ব্যবহার করুন।
GAN পরিবার
- DCGAN: CNN-based, baseline।
- cGAN: class label-conditioned generation।
- Pix2Pix, CycleGAN: image-to-image translation।
- WGAN-GP: Wasserstein distance — stable training।
- StyleGAN 2/3: photorealistic face generation।
- BigGAN: large-scale class-conditional।
🔑 FID Score
Fréchet Inception Distance — generated আর real distribution-এর Inception feature space-এ দূরত্ব। কম FID = ভালো quality।
অনুশীলন
১. MNIST-এ DCGAN train করে digit generate করুন।
২. CelebA-তে DCGAN দিয়ে face — FID measure করুন।
৩. Conditional GAN দিয়ে label-নির্দিষ্ট sample তৈরি করুন।
সারসংক্ষেপ
✨ এই অধ্যায়ে যা শিখলাম
- GAN = G vs D adversarial training।
- DCGAN baseline; StyleGAN photorealistic।
- Mode collapse ও instability — মূল চ্যালেঞ্জ।