Pengenalan Deep Learning Part 8 : Gender Classification using Pre-Trained Network (Transfer Learning)

Samuel Sena
7 min readMar 19, 2018

--

Rasanya udah lama ya saya ga nulis lagi :) Kali ini kita akan membahas tentang konsep dari Transfer Learning.

Transfer learning adalah suatu teknik atau metode yang memanfaatkan model yang sudah dilatih terhadap suatu dataset untuk menyelesaikan permasalahan lain yang serupa dengan cara menggunakannya sebagai starting point, memodifikasi dan mengupdate parameternya sehingga sesuai dengan dataset yang baru.

ImageNet

Sebelum melangkah lebih lanjut saya akan bahas sedikit tentang ImageNet. ImageNet adalah sebuah dataset yang terdiri dari 1.200.000 gambar untuk training dan 100.000 untuk testing. Dataset ini terdiri dari 1000 classes jadi untuk setiap class ada 1.200 gambar.

Tiap tahun ada semacam challenge untuk mencari model buatan siapa yang mempunyai tingkat akurasi tertinggi.

ImageNet Results

Sebenarnya ImageNet challenge ini sudah dimulai sejak 2010, saya kurang paham algoritma dan model apa yang digunakan pada rentang 2010–2011. Namun hasil yang paling standout adalah AlexNet pada 2012. AlexNet adalah model pertama yang menggunakan Convolutional Neural Network (CNN). Untuk detail lebih lanjut mungkin bisa dibaca sendiri papernya disini

Deeper Network = Better Result

Seiring dengan perkembangan teknologi tiap tahun, jumlah layer yang digunakan juga mengalami kenaikan yang hasilnya bisa dibilang setara dengan tingkat akurasi yang dihasilkan.

AlexNet Architecture

Gambar diatas adalah ilustrasi arsitektur AlexNet. Sama seperti arsitektur model yang sudah kita coba pada Part-7 lalu. AlexNet terbagi menjadi 2 bagian yaitu Feature Extraction layer dan Fully-Connected Layer.

Gender Classification

Kali ini kita akan melakukan percobaan untuk melakukan klasifikasi jenis kelamin seseorang berdasarkan foto mereka.

Dataset yang digunakan saya kumpulkan dari UI Faces API dan Random User Generator. Ada 800 foto untuk training data dan 240 foto untuk testing yang dibagi menjadi 2 classes yaitu male dan female. Gambar dari Random User Generator mempunyai ukuran yang sama yaitu 128x128 pixels namun foto dari UI Faces mempunyai ukuran yang berbeda-beda. Sehingga kita harus melakukan pre-processing terlebih dahulu untuk mendapatkan ukuran foto yang seragam sehingga dapat lebih mudah saat melakukan training.

Dataset bisa di download disini…

Sample Dataset

Pada percobaan ini kita akan menggunakan 2 buah model. Model pertama kita akan menggunakan arsitektur yang sederhana yang kita kasih nama KorNet :) dan model kedua adalah VGG-16 Network. Buat yang penasaran tentang VGG secara lengkap, bisa dibaca sendiri papernya disini.

KorNet

Arsitektur sederhana kita ini terdiri dari 87.969 buah parameter yang akan diupdate pada saat training. Pada feature extraction layer terdapat 4 Convolution Layer, ZeroPadding Layer dan MaxPooling Layer.

Sedangkan pada fully-connected layer terdapat 2 buah layer dengan jumlah neuron masing-masing sebanyak 32 dan 1. Perlu diingat bahwa layer terakhir adalah output layer. 1 buah layer disini karena kita akan melakukan binary classification, 0 untuk pria dan 1 untuk wanita. Sehingga activation function yang harus kita gunakan pada output layer adalah sigmoid dengan loss function binary crossentropy. Kita juga bisa menggunakan 2 neuron pada output layer, menggunakan activation function softmax dan loss function categorical crossentropy seperti pada Part-7.

Boleh dicoba mana yang lebih baik, tapi untuk percobaan kali ini, kita mau coba dengan 1 neuron dan sigmoid function.

Arsitektur KorNet :)

Dependencies and Global Variable

Dependencies yang akan kita gunakan hampir sama dengan Part-7. Tapi kali ini kita akan gunakan ImageDataGenerator. Dimensi gambar yang digunakan adalah 128 x 128 pixels. Kita juga gunakan TensorBoard untuk visualisasi pada saat training.

Data Augmentation

Image Augmentation

Seperti yang sudah kita ketahui, untuk mendapatkan performa yang optimal, Deep Learning membutuhkan data yang lebih banyak dibandingkan dengan algoritma ML yang lain.

Dari dataset yang telah kita kumpulkan hanya terdapat 400 foto pria dan 400 foto wanita. Jumlah data tersebut masih kurang mencukupi untuk mendapatkan performa yang optimal.

Untuk itu kita perlu meng-augmentasi data tersebut. Data Augmentation adalah sebuah teknik memanipulasi sebuah data tanpa kehilangan inti atau esensi dari data tersebut. Untuk data berupa Image, kita bisa lakukan rotate, flip, crop, dll.

Pada percobaan kita kali ini, kita akan melakukan shear, zoom dan flip sedangkan parameter rescale yang kita gunakan adalah membagi nilai RGB dari 0–255 dengan 255, sehingga kita mendapatkan nilai RGB pada rentang 0–1. Untuk data testing kita hanya melakukan rescale saja.

Method flow_from_directory dari ImageDataGenerator kita gunakan untuk mengubah data yang berupa “raw image” menjadi sebuah dataset yang akan kita gunakan untuk training dan testing, tentu saja dataset yang telah kita augmentasi tadi.

KorNet Model

Kali ini kita akan melakukan klasifikasi terhadap 2 class atau biasa disebut binary classification. 0 untuk class pertama dan 1 untuk class kedua. Jika dilihat dari karakteristik outputnya, kita bisa gunakan “Sigmoid” sebagai activation function pada output layer dan untuk semua hidden layer kita gunakan ReLU.

Karena ini adalah binary classification, loss function yang kita gunakan adalah binary_crossentropy dan Adam sebagai optimizer nya.

KorNet Result

KorNet Complete Code

Setelah 50 epoch training-testing, kita mendapatkan loss dan accuracy sebesar 0.4847 crossentropy loss dan 76.97% accuracy.

Grafik dibawah juga menunjukkan bahwa performa dari model kita ini tidak begitu baik. Terdapat indikasi overfitting, nilai loss dan akurasi yang relatif rendah.

KorNet Result

Transfer Learning

Seperti yang sudah kita coba tadi, untuk membuat model yang dapat mengenali gender tidaklah mudah, apalagi dengan jumlah data yang sangat sedikit.

Untuk itu kita bisa menggunakan Transfer Learning. Kita akan gunakan model VGG-16 yang sudah dilatih pada data ImageNet dengan cara membuat arsitektur yang identik dengan VGG-16 tetapi tanpa fully-connected layer dan mendownload weights nya. Keras menyediakan beberapa model ImageNet yang populer untuk bisa kita gunakan.

Seluruh weight VGG-16 telah dilatih menggunakan dataset ImageNet dan sudah dapat mengenali warna, tekstur, dll. Sehingga kita bisa manfaatkan ini untuk meng-extract feature dari semua foto pada dataset kita.

VGG-16

VGG-16 Architecture

Gambar diatas adalah arsitektur dari VGG16 (16 Layer). Yang akan kita gunakan adalah Feature Extraction Layer saja, tentu saja dengan weights yang dapat kita download. Weights nya berupa file .h5 seperti yang sudah kita gunakan sebelumnya.

FC layer pada VGG16 terdiri dari 4096–4096–4096 neuron pada hidden layer dan 1000 neuron pada output layer karena ImageNet mempunyai 1000 classs. Sedangkan dataset kita hanya mempunyai 2 class (Male/Female), sehingga kita harus membuat FC layer versi kita sendiri.

Kita akan gunakan FC Layer KorNet yaitu 32 neuron pada hidden layer dan 1 neuron pada output layer dengan sigmoid activation.

VGG-16 Dependencies and Variable

Hampir sama dengan dependencies KorNet, namun kita membutuhkan package applications untuk dapat menggunakan VGG16.

VGG-16 Model and Data Augmentation

Dengan menggunakan package applications dari Keras. Kita bisa langsung menggunakan VGG-16 tanpa harus menyusunnya layer demi layer dan mendownload weights nya.

Argument include_top=False diatas menandakan jika kita tidak menggunakan FC Layer dari VGG-16. Sehingga jika kita melakukan “predict” untuk model ini maka yang akan terjadi adalah dataset akan mengalir pada feature extraction layer dari VGG-16. Hasilnya adalah feature map yang bisa kita simpan pada file train_features.npy dan val_features.npy yang nantinya bisa kita flatten dan kita gunakan untuk melakukan training pada FC Layer versi kita sendiri.

VGG-16 FC Layer

Setelah kita mendapatkan feature map pada tahap sebelumnya, kita akan gunakan feature map tersebut sebagai data training dan testing untuk FC Layer kita. Simple kan … :)

Transfer Learning Result

Transfer Learning Complete Code

Setelah 50 epoch training-testing, kita mendapatkan loss dan accuracy sebesar 0.2985 crossentropy loss dan 90.44% accuracy. Terdapat banyak peningkatan bukan?

Namun jika dilihat dari grafiknya, masih terjadi overfitting. Kita bisa tangani ini dengan cara menggunakan FC Layer yang lebih sederhana, menggunakan Dropout, melakukan augmentasi yang lebih agresif lagi atau menambah jumlah data.

Bonus Experiment

Ada percobaan menarik nih. Kita akan mencoba melakukan klasifikasi terhadap beberapa foto public figure. Kita lihat apakah model kita dapat mengenali gender mereka?

Bonus Experiment Data

Saya sengaja memilih 3 foto dari masing-masing class yang cukup jelas gendernya. Sedangkan Brienne dan Legolas kalau dilihat-lihat, rasanya akan sulit dibedakan gendernya. Kita akan gunakan model yang sudah kita latih tadi untuk memprediksi gender delapan foto diatas. Hasilnya ….

Bonus Experiment Result
  • Briene : 99,5% Laki :D
  • Raisa : 0.000000358% Laki atau 99,9999642% Perempuan
  • Isyana : 0.00000485% Laki atau 99,999515% Perempuan
  • Marion : 0.0000035% Laki atau 99,99965% Perempuan
  • Jon Snow : 0.0000158% Laki atau 99,99842% Perempuan (Aneh banget :P)
  • Prabowo : 97.2% Laki
  • Jokowi : 99.9% Laki
  • Legolas : 48,4% Laki atau 51,6% Perempuan (Girly)

Dari hasil diatas Brienne dianggap Cowok, Legolas ragu-ragu, Jon Snow Cewek, Raisa yang paling Girly dan Pak Jokowi yang paling Manly :D

Semoga Bermanfaat. Sampai ketemu di Part selanjutnya, tapi saya sendiri masih bingung mau nulis apa.. :)

--

--