Bài 3: Conditional GAN (cGAN) | Deep Learning cơ bản
 

Bài 3: Conditional GAN (cGAN)

| Posted in GAN

Bài trước mình giới thiệu về DCGAN, dùng deep convolutional network trong mô hình GAN. Tuy nhiên khi ta train GAN xong rồi dùng generator để sinh ảnh mới giống trong dataset mình không kiểm soát được là ảnh sinh ra giống category nào trong dataset. Ví dụ như dùng GAN để sinh các chữ số trong bộ MNIST, thì khi train xong và dùng generator sinh ảnh thì mình không biết được ảnh sinh ra sẽ là số mấy (0 -> 9). Bài toán hôm nay muốn kiểm soát được generator sinh ra ảnh theo 1 category nhất định. Ví dụ có thể chỉ định generator sinh ra số 1 chẳng hạn. Mô hình đấy gọi là Conditional GAN (cGAN).

Fashion-MNIST

Dữ liệu Fashion-MNIST về quần áo, giày dép gồm 60000 ảnh training và 10000 ảnh test. Ảnh xám kính thước 28*28 thuộc 10 lớp khác nhau.

LabelDescription
0T-shirt/top
1Trouser
2Pullover
3Dress
4Coat
5Sandal
6Shirt
7Sneaker
8Bag
9Ankle boot
Các lớp trong bộ dữ liệu Fashion-MNIST

Bài toán hôm nay sẽ dùng cGAN để sinh ra dữ liệu trong từng thể loại ở dữ liệu Fashion-MNIST. Ví dụ sinh ra các ảnh áo Shirt.

Ảnh dữ liệu Fashion-MNIST

Cấu trúc mạng

Generator

Ở bài trước thì Generator sinh ảnh fake từ noise vector. Cái hay của random vector là mình có thể sample được nhiều giá trị khác nhau, thành ra khi train xong mạng GAN thì mình có thể sinh được nhiều ảnh fake khác nhau. Tuy nhiên mình lại không thể kiểm soát xem ảnh sinh ra thuộc thể loại nào (áo, giày, dép,…).

Bên cạnh noise vector z, mình sẽ thêm vào y, 1 số từ (0 – 9), mỗi thể loại trong dữ liệu Fashion-MNIST sẽ được encode về 1 số. Mình mong muốn là z với số y nào thì sẽ cho ra dữ liệu tương ứng thể loại đấy.

Mô hình Generator cGAN

Input z là noise vector như bài trước, sau đấy được qua dense layer về kích thước 7*7*128 rồi reshape về dạng 3D tensor kích thước 7x7x128 (y1)

Input y là 1 số được đi qua embedding layer của keras, layer này giống như 1 dictionary map mỗi số thành một vector 50*1, sau đó được qua dense với output 49 node cuối cùng được reshape về 3D tensor kích thước 7x7x1 (y2)

Sau đó y1 và y2 được xếp chồng lên nhau thành tensor 3d kích thước 7*7*129, tiếp đi qua transposed convolution để tăng kích thước lên 14*14 và 28*28, cuối cùng cho ra output 28*28*1.

Discriminator

Discriminator mục đích phân biệt ản thật trong dataset và ảnh fake sinh ra bởi generator.

Tương tự như ở trong generator bên cạnh ảnh, mình sẽ thêm vào y, 1 số từ (0 – 9) tương ứng với thể loại trong dữ liệu Fashion-MNIST.

Mô hình Discriminator cGAN

Input y là 1 số được đi qua embedding layer của keras, layer này giống như 1 dictionary map mỗi số thành một vector 50*1, sau đó được qua dense với output 28*28 node cuối cùng được reshape về 3D tensor kích thước 28x28x1 (y1)

Sau đó y1 và ảnh input được xếp chồng lên nhau thành tensor 3d kích thước 28*28*2, sau đó tensor đi qua convolution với stride = 2 để giảm kích thước ảnh từ 28*28 -> 14*14 -> 7*7. Khi giảm kích thước thì depth tăng dần. Cuối cùng thì tensor shape 2*2*512 được reshape về vector 2048 và dùng 1 lớp fully connected chuyển từ 2048d về 1d.

Loss function

Loss function cGAN

Code

Code mọi người lấy ở đây.

Sau khi train xong thì mình có thể sinh ra ảnh theo từng thể loại trong Fashion-MNIST

Ảnh sinh ra bởi cGAN


Deep Learning cơ bản ©2024. All Rights Reserved.
Powered by WordPress. Theme by Phoenix Web Solutions