অধ্যায়Phase 6 · মডার্ন AI ভিশন
6.2 15 মিনিট পড়া

GAN Basics

Generator-discriminator architecture।

🎬 গল্প দিয়ে শুরু
"This Person Does Not Exist" — ওই ওয়েবসাইটের প্রতিটি মুখ AI-এর তৈরি। কেউ নেই, তবু মুখগুলো photorealistic। এর পেছনে — GAN (Generative Adversarial Network)

মূল ধারণা — দুই network-এর যুদ্ধ

GAN-এ দুটি network একে অপরের বিরুদ্ধে শেখে:

  • Generator (G) — random noise z থেকে fake image তৈরি করে।
  • Discriminator (D) — real vs fake আলাদা করে।
  • G চায় D-কে ধোঁকা দিতে; D চায় ধরা পড়াতে।
text
z (noise) → G → fake image ─┐
                              ├─→ D → real / fake ?
real image  ─────────────────┘

Loss — minimax game

text
min_G  max_D  E[log D(x)] + E[log(1 - D(G(z)))]
Equilibrium
আদর্শ অবস্থায় D(x) = 0.5 — D আর পার্থক্য বলতে পারে না, G perfect হয়েছে।

মিনিমাল DCGAN — PyTorch

python
dcgan.py (snippet)
import torch, torch.nn as nn

class G(nn.Module):
    def __init__(self, z=100, ch=64):
        super().__init__()
        self.net = nn.Sequential(
            nn.ConvTranspose2d(z, ch*8, 4, 1, 0), nn.BatchNorm2d(ch*8), nn.ReLU(True),
            nn.ConvTranspose2d(ch*8, ch*4, 4, 2, 1), nn.BatchNorm2d(ch*4), nn.ReLU(True),
            nn.ConvTranspose2d(ch*4, ch*2, 4, 2, 1), nn.BatchNorm2d(ch*2), nn.ReLU(True),
            nn.ConvTranspose2d(ch*2, ch,   4, 2, 1), nn.BatchNorm2d(ch),   nn.ReLU(True),
            nn.ConvTranspose2d(ch, 3, 4, 2, 1), nn.Tanh())
    def forward(self, z): return self.net(z)

class D(nn.Module):
    def __init__(self, ch=64):
        super().__init__()
        self.net = nn.Sequential(
            nn.Conv2d(3, ch, 4, 2, 1), nn.LeakyReLU(0.2, True),
            nn.Conv2d(ch, ch*2, 4, 2, 1), nn.BatchNorm2d(ch*2), nn.LeakyReLU(0.2, True),
            nn.Conv2d(ch*2, ch*4, 4, 2, 1), nn.BatchNorm2d(ch*4), nn.LeakyReLU(0.2, True),
            nn.Conv2d(ch*4, 1, 4, 1, 0), nn.Sigmoid())
    def forward(self, x): return self.net(x).view(-1)

Training loop (সরলীকৃত)

python
for real in loader:
    # ---- D ----
    z = torch.randn(b, 100, 1, 1, device=dev)
    fake = G(z).detach()
    loss_D = bce(D(real), ones) + bce(D(fake), zeros)
    opt_D.zero_grad(); loss_D.backward(); opt_D.step()

    # ---- G ----
    fake = G(torch.randn(b, 100, 1, 1, device=dev))
    loss_G = bce(D(fake), ones)   # G চায় D ভাবুক "real"
    opt_G.zero_grad(); loss_G.backward(); opt_G.step()
Mode collapse
G একই ধরনের image বানাতে থাকে — diversity হারায়। সমাধান: WGAN-GP, spectral normalization, label smoothing।

GAN পরিবার

  • DCGAN — convolutional baseline।
  • Pix2Pix — paired image-to-image (sketch → photo)।
  • CycleGAN — unpaired (horse ↔ zebra, summer ↔ winter)।
  • StyleGAN2/3 — photorealistic face, style control।
  • SRGAN/ESRGAN — super-resolution।

ব্যবহারিক ক্ষেত্র

  • Data augmentation — কম sample-এ synthetic data।
  • Super-resolution — পুরনো photo restore।
  • Style transfer, deepfake (ethical caution!)।
  • Domain adaptation — sim → real।
প্র্যাকটিস টাস্ক
  1. MNIST-এ DCGAN train করে digit generate করুন।
  2. CycleGAN দিয়ে Bangladeshi day → night street photo translate করুন।
  3. ESRGAN দিয়ে পুরনো family photo 4x upscale করুন।