การฝึก GAN

Deep Learning สำหรับภาพด้วย PyTorch

Michal Oleszak

Machine Learning Engineer

เป้าหมายของ generator

 

 

ไดอะแกรมขั้นตอนการทำงานของ GAN

  • เป้าหมาย: สร้างภาพปลอมที่หลอก discriminator ได้
  • แนวคิด: ใช้ discriminator บอกประสิทธิภาพของ generator
  • ผลลัพธ์ของ generator ที่ discriminator จำแนกว่า:
    • จริง (label 1) — ดี, loss น้อย
    • ปลอม (label 0) — ไม่ดี, loss มาก
Deep Learning สำหรับภาพด้วย PyTorch

Generator loss

def gen_loss(gen, disc, num_images, z_dim):

noise = torch.randn(num_images, z_dim)
fake = gen(noise)
disc_pred = disc(fake)
criterion = nn.BCEWithLogitsLoss()
gen_loss = criterion( disc_pred, torch.ones_like(disc_pred) ) return gen_loss
  • กำหนด noise แบบสุ่ม
  • สร้างภาพปลอม
  • ดูค่าทำนายของ discriminator บนภาพปลอม
  • ใช้ binary cross-entropy (BCE) เป็น criterion
  • generator loss: BCE ระหว่างค่าทำนายของ discriminator กับ tensor ของค่า 1
Deep Learning สำหรับภาพด้วย PyTorch

เป้าหมายของ discriminator

 

 

ไดอะแกรมขั้นตอนการทำงานของ GAN

  • เป้าหมาย: จำแนกภาพปลอมและภาพจริงให้ถูกต้อง
  • ผลลัพธ์ของ generator ควรถูกจำแนกว่าปลอม (label 0)
  • ภาพจริงควรถูกจำแนกว่าจริง (label 1)
Deep Learning สำหรับภาพด้วย PyTorch

Discriminator loss

def disc_loss(gen, disc, real, num_images, z_dim):

criterion = nn.BCEWithLogitsLoss()
noise = torch.randn(num_images, z_dim)
fake = gen(noise)
disc_pred_fake = disc(fake)
fake_loss = criterion( disc_pred_fake, torch.zeros_like(disc_pred_fake) )
disc_pred_real = disc(real)
real_loss = criterion( disc_pred_real, torch.ones_like(disc_pred_real) )
disc_loss = (real_loss + fake_loss) / 2 return disc_loss
  • กำหนด binary cross-entropy criterion
  • สร้าง input noise สำหรับ generator
  • สร้างภาพปลอม
  • ดูค่าทำนายของ discriminator สำหรับภาพปลอม
  • คำนวณส่วน fake loss
  • ดูค่าทำนายของ discriminator สำหรับภาพจริง
  • คำนวณส่วน real loss
  • loss สุดท้ายคือค่าเฉลี่ยของ real loss และ fake loss
Deep Learning สำหรับภาพด้วย PyTorch

Training loop ของ GAN

for epoch in range(num_epochs):
    for real in dataloader:
        cur_batch_size = len(real)


disc_opt.zero_grad()
disc_loss = disc_loss( gen, disc, real, cur_batch_size, z_dim=16)
disc_loss.backward() disc_opt.step()
gen_opt.zero_grad()
gen_loss = gen_loss( gen, disc, cur_batch_size, z_dim=16)
gen_loss.backward() gen_opt.step()
  • วน loop ตาม epoch และ batch ข้อมูลจริง แล้วคำนวณขนาด batch ปัจจุบัน
  • รีเซ็ต gradient ของ optimizer ของ discriminator
  • คำนวณ discriminator loss
  • คำนวณ gradient ของ discriminator และอัปเดตพารามิเตอร์
  • รีเซ็ต gradient ของ optimizer ของ generator
  • คำนวณ generator loss
  • คำนวณ gradient ของ generator และอัปเดตพารามิเตอร์
Deep Learning สำหรับภาพด้วย PyTorch

มาฝึกกันเถอะ!

Deep Learning สำหรับภาพด้วย PyTorch

Preparing Video For Download...