Conditional GAN

Sorayut M
Super AI Engineer
Published in
4 min readMar 28, 2021

อธิบาย CGAN Concept and implementation using Pytorch

Generated MNIST digits, each row conditioned on one label

บทความนี้คาดหวังว่าผู้อ่าน จะมีพื้นฐานความรู้เกี่ยวกับ Deep Learning บ้าง และรู้เกี่ยวกับ GAN intuition มาบ้างแล้ว แต่ถ้าไม่มีจะ recap ให้หน่อยนึง

บทความนี้เป็นส่วนหนึ่งของโครงการ Super AI Engineer

Roughly recap about GAN

GAN ย่อมาจาก Generative Adversarial Networks

Machine Learning สามารถแบ่งได้เป็น 2 แบบ ตามชนิด Output ที่ต้องการ คือ Discriminative model เช่น Classify รูป และ Generative model เช่น Represent รูปภาพจาก Class ที่กำหนด

โดย GAN เป็นชนิด Generative model

Taxonomy of Generative Models (from Ian Goodfellow’s NIPS tutorial, 2016)

ใน GAN จะมี model 2 ตัว คือ

  • Generator ทำหน้าที่สร้างรูปภาพปลอมขึ้นมา (เป็นอย่างอื่นที่ไม่ใช้รูปภาพก็ได้) เปรียบเหมือนโจร
  • Discriminator ทำหน้าที่ Classification ว่ารูปภาพนั้น เป็นรูปที่ถูก Generator สร้างขึ้นมา หรือเป็นรูปภาพของจริง เปรียบเหมือน ตำรวจ

ทั้งสอง model จะแข่งขันกัน กล่าวคือ Generator ก็จะสร้างรูปที่เหมือนจริงมากขึ้น ส่วน Discriminator ก็จะตรวจสอบได้แม่นขึ้น

ตามปกติ GAN จะมี Input เป็น Random Noise คือเราใส่ไปให้ Generator แล้ว Generator จะสร้างรูปภาพปลอมมาให้เรา เหตุผลคือ Random Noise จะเหมือนเป็นตัวอ้างอิงว่า รูปภาพที่เราสร้างมาใหม่ จะไม่ซ้ำเดิม เนื่องจาก Input เปลี่ยนไป

โดยในท้ายที่สุดแล้ว เราก็เอา Generator ที่เก่ง (สร้างรูปได้เหมือนจริง) ไปใช้งานต่อ จริง ๆ Appication ของ GAN มีเยอะมาก ไว้จะมาสรุปในบทความต่อไป

ข้อมูลเพิ่มเติมเกี่ยวกับ GAN อ่านต่อได้ที่ [1]NIPS 2016 Tutorial: Generative Adversarial Networks Ian Goodfellow

Unconditionnal Generation VS Conditionnal Generation

Unconditional Generation เปรียบเหมือนตู้สุ่มกาชาปอง คือ เรารู้แหละ ว่ามันต้องมีของออกมา แต่เราไม่รู้ว่าของที่จะออกคืออะไร… เพราะ มันสุ่มให้ เราใส่แค่เงินพอ

Conditional Generation เหมือนกับ ตู้ขายของอัตโนมัติ ที่เราใส่ทั้งเงิน และบอกไปด้วยว่าเราอยากได้ น้ำเปล่านะ เครื่องมันก็จะเอาน้ำเปล่าให้เรา

จะสังเกตุได้ว่า Unconditional Generator เราใส่ไปแค่เงินเท่านั้น โดยเงินเปรียบเหมือน Random Noise ที่ใส่ไปเพียงแค่ให้มันสร้างรูปที่ Random เช่น ถ้าเรา Train GAN ด้วยรูปภาพของสัตว์ พอเราเอาไปใช้งาน มันก็สร้างรูปภาพสัตว์ออกมาเฉย ๆ เราไม่สามารถควบคุมได้ว่า เราอยากได้แมว

แต่ใน Conditional Generator เราใส่เงิน พร้อมกันกับใส่ของที่เราอยากได้ เหมือนกับเราใส Random Noise พร้อมกับระบุว่า เราอยากได้แมว พอ Noise เท่ากับค่านี้ Generator ก็อาจจะสร้างแมวส้มให้ และพอรันใหม่อาจได้แมวแบบอื่น แต่มันก็ยังคงเป็นแมว

สรุป

Conditional Generation Input

ตามที่บอกไปว่า Conditional GAN ต้องการ Input ที่มี label พร้อมกับ Noise หัวข้อนี้จะอธิบายวิธีการสร้าง Input แบบนั้น โดยแยกเป็นของ Generator และ Discriminator

Generator Input

ใน Generator เรา add label แบบ one-hot encoding ไปกับ Noise vector เลย โดย label นั้นก็จะบอก Class ที่เราค้องการ ส่วน Noise ก็เป็นตัวเปลี่ยนแมวเป็นคนละตัว แต่ยังเป็น Class แมวส้มอยู่

Discriminator Input

Discriminator ทำหน้าที่ Classification รูปภาพ Input ของมันคือรูปภาพ โดยมี

  1. รูปภาพจาก Generator (Fake images)
  2. รูปภาพจาก Dataset (Real images)

ในกรณี Condition GAN, Input ของ Discriminator จำเป็นต้องใส่ label เข้าไปด้วย เหมือนกับของ Generator เลย แต่เนื่องจาก Input ของ Driscriminator นั้นเป็นรูปภาพ เราเลยต้องใส่ one-hot label ในลักษณะของง Matrix ตามรูป

โดย 3 Channel แรก คือ red, green, blue ของรูปภาพ ส่วนที่เหลือคือ one-hot label

บางคนอาจจะสงสัยว่า ทำไม Discriminator ต้องมี label ด้วยล่ะ ?????

คือ Generator อะพอเข้าใจได้ เพราะ จะได้สร้างรูปตาม label ที่กำหนด แต่ Discriminator มันแค่แยก “รูปปลอม” กับ “รูปจริง” เองนี่

คำตอบ คือ แม้ว่ารูปนั้นจะเหมือนจริงแค่ไหน แต่ถ้าไม่ใช่ตาม label ที่กำหนด Discriminator ก็จะบอกว่ามัน fake!!! เหตุผลที่ทำแบบนี้คือ เป็นเหมือนการสอนให้ model มัน Generate ให้ตรงตามที่ต้องการ

จบเรื่อง Concept แล้ว จริง ๆ สรุปง่าย ๆ เลย Unconditional GAN มันไม่ต้องมี label แต่สำหรับ Conditional GAN มันต้องการ label ไปใน Input ด้วย

walk through code

Disclaimer: code ส่วนใหญ่ เอามาจาก [3]Build Basic Generative Adversarial Networks (GANs) Course by DeepLearning.AI

Code : Conditional_GAN Colab notebook

ใน code ส่วนแรกจะเป็นการสร้าง model Generator, Discriminator, สร้าง Noise, download dataset สามารถทำความเข้าใจจาก comment ใน code ที่ให้ได้เลย

ต่อมาจะเป็นการ Train Uncodional GAN พอ Train เสร็จ เราสามารถเอา Generator ไปใช้งานต่อได้ โดยใส่ Noise vector ที่มี Shape เท่าเดิม และผลลัพธ์ที่ได้จากการ Train 100 epochs เป็นไปตามรูปด้านล่าง

ต่อมา เป็นส่วนของ Conditinal GAN โดยมี function เพิ่มเติม ดังนี้

  • Function สร้าง One-hot label โดยใช้ของ import torch.nn.functional as F อ่านเพิ่มได้ที่ Docs
  • function นี้ ทำหน้าที่เอา Noise vector มาต่อกับ One-hot label ใช้ได้ทั้ง Generator และ Discriminator เพราะให้ dim=1 อ่านเกี่ยวกับ torch.cat ได้ที่ docs
  • function นี้ ให้ shape ของ input ของ Noise vector รวมกับ one-hot label โดยมีทั้งของ Generator ที่ต่อกันแบบ 1D vector และของ Discriminator ที่ต่อกันแบบ Matrix ซ้อนกัน

พอได้ function ที่มีไว้สำหรับเตรียม Imput เข้า Conditional GAN แล้ว เราฏ็ทำการ Train ได้เลย โดยเริ่มจากการ Initilize ก่อน

พอทำการ Train เสร็จ เราลองเอา Input noise + label ใส่เข้าไปที่ Generator ดู จะพบว่า เราสามารถเลือกให้มัน สร้างรูปภาพตาม Class ที่เราต้องการ ยกตัวอย่างเช่น สร้าง Class เลข 6 ตามรูป

สรุป

Condition GAN สามารถ Generate รูปภาพตาม Class ที่เราระบุได้ ทำได้โดย เพิ่ม label เข้าไปใน Input ทั้งใน Generator และ Discliminator

ตอนต่อไปจะมาเขียนเกี่ยวกับ Controllable Generation ซึ่งเราสามารถควบคุม features ใน Class ได้ ยกตัวอย่างเช่น ถ้าอยากจะ Generate แมวส้ม ให้ใช้ Condition แต่ถ้าอยาก Generate แมวส้มที่กำลังยิ้ม หรือแมวส้มที่กำลังกินข้าว ก็จะใช้เป็น Controllable Generation

ถ้าอ่านแล้วรู้สึกเป็นประโยชน์ ฝากกด Clap 👏👏 ให้ด้วยนะครับ ขอบคุณครับ 🙏

ผิดพลาดประการใด comment มาได้นะครับ

References

[1] I. Goodfellow, “NIPS 2016 Tutorial: Generative Adversarial Networks,” 2017.

[2] M. Mirza and S. Osindero, “Conditional Generative Adversarial Nets,” 2014.

[3] https://www.coursera.org/learn/build-basic-generative-adversarial-networks-gans

--

--