Menginvestigasi Kemampuan Generative Adversarial Network

Untuk tahun 2019 ini, kami dari Grup Riset Artificial Intelligence Laboratory Universitas Telkom mencoba untuk bermain-main dengan implementasi Generative Adversarial Network sambil menginvestigasi seberapa jauh kemampuan GAN yang bisa kita mainkan. Setelah dua bulan mempelajarinya, kini kami ingin berbagi pengetahuan mengenai GAN ini

(narsis dikit) kegiatan Riset 2019

Apa itu GAN?

Generative Adversarial Network adalah sebuah arsitektur jaringan saraf tiruan yang bertujuan untuk membentuk atau membangkitkan suatu data yang benar-benar baru, dari tidak ada menjadi ada. Umumnya target utama dari GAN adalah data citra. Secara singkat, jaringan GAN dilatih untuk mampu membangkitkan suatu gambar baru berdasarkan kumpulan gambar yang telah ia lihat sebelumnya selama proses pelatihan.

Lihat contoh gambar berikut yang merupakan citra hasil bentukan dari salah satu arsitektur GAN bernama Progressive GAN. Perlu diperhatikan bahwa semua gambar ini adalah gambar orang fiktif yang dibangkitkan oleh komputer. Terlihat seperti orang sungguhan, kan?

Progressive GAN

Melihat menariknya kemampuan GAN, mari kita coba lihat lebih dalam seperti apa GAN itu sebenarnya.

siap, GAN?

Arsitektur Generative Adversarial Network

Secara umum arsitektur GAN terdiri dari 2 jaringan yang disebut sebagai jaringan Generator dan Discriminator. Bentuk jaringan Generator dapat dilihat berkebalikan dengan struktur jaringan saraf pada umumnya. Jaringan Generator menerima input sebuah vektor angka z, kemudian mengubahnya menjadi output gambar tiga dimensi.

Vektor input z umumnya dibangkitkan secara acak, lalu dari angka sembarang tersebut Generator membangkitkan gambar yang juga sembarang.

membangkitkan gambar dari input vektor acak

Nah, lalu bagaimana caranya Generator tahu harus menggambar yang seperti apa?

Di sinilah hadir Jaringan kedua yang bernama Discriminator. Jaringan Discriminator merupakan jaringan klasifikasi biner yang menerima input gambar tiga dimensi dan mengeluarkan klasifikasi menyatakan input gambar adalah gambar asli dari dataset atau merupakan gambar buatan Generator. Discriminator dilatih dengan sekumpulan data yang dibangkitkan oleh Generator, dan sekumpulan data dari dataset, dan dilatih untuk bisa membedakan keduanya.

arsitektur GAN

Gambar-gambar Generator yang berhasil dikenali Discriminator sebagai gambar “palsu”, akan dikembalikan sebagai feedback pada jaringan Generator. Tugas Generator kini adalah dilatih untuk bisa membuat sekumpulan gambar palsu, yang saat dilihat oleh Discriminator, Discriminator tidak bisa membedakan antara asli dan palsunya.

Tugas Generator bisa dianalogikan seperti pemalsu uang, sementara Discriminator bisa disebut seperti polisi.

Polisi dilatih untuk belajar bagaimana membedakan uang yang asli dengan uang palsu, sementara Pemalsu juga selalu mencoba membuat uang palsu sebaik baiknya.

Setelah mengetahui intuisi dari jaringan Generative Adversarial Network, mari kita mulai membangunnya.

Membangun Jaringan GAN

Di sini kita tidak langsung membuat GAN yang mampu menggambar citra beresolusi tinggi. Kita mulai dengan data sederhana yang jauh lebih mudah, yaitu dataset citra angka tulisan tangan MNIST. Kita akan bangun GAN kita (tentunya) menggunakan bahasa pemrograman Python dengan bantuan library Keras dan TensorFlow.

Pertama-tama, kita import dulu semua kebutuhan library-nya

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
from keras.models import Sequential, load_model
from keras.layers import Dense, Conv2D, Flatten
from keras.layers import BatchNormalization, Dropout
from keras.layers import Reshape, UpSampling2D
from keras.layers import MaxPooling2D, Activation
from keras.datasets import mnist
from keras.optimizers import SGD
from keras.utils import to_categorical
from PIL import Image

Selanjutnya, kita bangun Jaringan Generator dan Discriminator

Model Jaringan Generator

Input Generator adalah sebuah array yang dibangkitkan secara random, disebut “seed”. Di sini kami tetapkan ukuran input seed adalah [1x100]. Dari masukan seed tersebut, Generator akan mengubahnya menjadi sebuah gambar berukuran [28x28] menggunakan Convolutional Neural Network. Secara detil, arsitektur Generator adalah sebagai berikut

Arsitektur Generator

Berikut adalah code dari arsitektur jaringan Generator

Model Jaringan Diskriminator

Diskriminator merupakan CNN yang menerima input image berukuran [28,28] dan menghasilkan angka biner yang menyatakan apakah input gambar merupakan gambar dari dataset asli (kelas 1) atau merupakan gambar baru/gambar palsu (kelas 0)

Arsitektur Discriminator

Berikut adalah code dari arsitektur jaringan Discriminator

Sekarang, setelah kedua model Jaringan dibuat, saatnya jaringan tersebut dilatih, gan!

Proses Pelatihan GAN

Secara berurutan, untuk setiap epoch pelatihan akan melakukan tiga tahapan yaitu:

  1. Bangkitkan data citra palsu menggunakan Generator sejumlah dataset citra asli
  2. Latih Discriminator untuk bisa membedakan dataset citra asli dari dataset citra palsu
  3. Gunakan Discriminator yang sudah dilatih untuk melatih Generator agar bisa membangkitkan dataset citra palsu yang dinilai asli oleh Discriminator
tiga tahap pelatihan GAN

Untuk mempermudah proses pada tahap ketiga, kita akan bangun model ketiga yang merupakan gabungan dari model Generator dan Discriminator.

Selanjutnya kita bangun fungsi pelatihan sesuai tahapan yang dijelaskan. Berikut adalah kode lengkap untuk melatih jaringan

Setelah semuanya siap, mari kita mulai melatih kedua model. Perhatikan pada kode di bawah, bahwa data MNIST kita praproses agar data kini berada pada rentang (-1,1)

Sudah dilatih, nih. Semoga agan tidak pusing.

Membangkitkan Citra menggunakan GAN

Setelah model Generator selesai dilatih, sekarang mari kita coba bangkitkan citra baru. Di sini kita bangkitkan 4 vektor initial seed secara acak, kemudian kita gunakan model Generator untuk menggambarnya.

Berikut adalah contoh hasil 4 citra tersebut

contoh hasil output

bagus gak, GAN?

Bisa kita lihat, bahwa model jaringan Generator sudah mampu menggambar angka yang mirip dengan dataset MNIST dari input angka acak. Kemudian dapat kita perhatikan juga, bahwa jika kita acak input angka seed baru lagi, masing-masing dapat menghasilkan citra yang berbeda-beda. Bahkan input seed yang berbeda sedikit saja, hasil gambarnya bisa saja berbeda.

Di sini, jadi muncul pertanyaan baru. Kami ingin mencari tahu, input seed yang seperti apa, yang akan menghasilkan/membangkitkan gambar yang bagaimana

Mengidentifikasi Initial Random Seed

Sekarang, akan kita coba untuk menjawab pertanyaan tersebut. Untuk melakukannya, tentunya pertama kita harus bisa mengenali apa isi citra hasil bentukannya. Artinya kita butuh model klasifikasi yang bisa mengklasifikasikan data angka tulisan tangan. Karena itu, pada uji coba kali ini kami membuat sebuah model klasifikasi MNIST menggunakan Convolutional Neural Network untuk bisa mengklasifikasikan dataset citra MNIST.

Setelah model klasifikasi dilatih, kami coba bangkitkan 5000 vektor seed untuk membentuk 5000 citra MNIST baru. Citra baru tersebut kemudian kami klasifikasikan dengan model klasifikasi MNIST, lalu citra-citra beserta vektor input seed-nya tersebut kami kelompokkan berdasarkan kelas hasil klasifikasinya. Sehingga kini kita memiliki 10 buah array yang masing-masing berisi input seed yang membentuk kelas gambar yang sama.

Selanjutnya kami mencoba merata-ratakan kumpulan seed tersebut, sehingga menghasilkan seed baru untuk masing-masing kelas.

Ternyata jika kita bangkitkan citra baru dari seed rata-rata tersebut, akan menghasilkan citra yang sesuai dengan kelas rata-ratanya. Berikut adalah hasil citra yang dibangkitkan dari rata-rata input seed kelas

citra hasil rata-rata seed

Hasilnya bisa jadi lebih bagus. Menarik ya, gan?

Kita bahkan ternyata bisa bermain-main dengan hasil rata-rata seed tersebut. Di sini kami mencoba mengurangi nilai rata-rata kelas 9 dengan rata-rata kelas 1.

Lalu kita coba tampilkan gambar yang dibangkitkan. Apa yang terjadi….?

Uwow, ternyata hasilnya jadi angka 0. Make sense, ya? Gambar 9, dikurangi Gambar 1 (garis), maka sisa nya gambar 0. Mari kita coba lagi kalau rata-rata kelas 6 kita kurangi dengan angka 0. Harusnya sekarang jadi gambar 1

Dan ternyata benar. Nah berarti 1+0 jadi apa?

Ternyata tetap jadi 0.

Penutup

Kira-kira cukup dimikian tutorial dari kami. Semoga tutorial sederhana ini membantu dan menginspirasi.

Setelah ini, kami akan menginvestigasi lebih jauh apa saja yang bisa kita mainkan dengan pengetahuan ini

Tunggu tutorial selanjutnya dari kami. Salam Amazing dari Lab AI

Tautan Tutorial

--

--