Pengenalan Deep Learning Part 7 : Convolutional Neural Network (CNN)

Pada part-5 kita sudah membahas tentang penggunaan MLP untuk melakukan klasifikasi dengan hasil yang cukup baik. Sebelum kita membahas lebih lanjut tentang CNN, kita akan melihat kelemahan dari MLP jika digunakan untuk data image dan kenapa kita membutuhkan CNN.


The Problem

Data MNIST diatas terdiri dari nilai 0–255 untuk setiap pixel yang ada. Kita bisa saja menggunakan MLP untuk melakukan klasifikasi untuk semua digit dengan hasil yang cukup baik karena sebagian besar data pada MNIST, object yang akan dikenali berada ditengah-tengah gambar.

Lalu bagaima jika object yang akan dikenali tidak berada ditengah-tengah gambar? Disinilah kelemahan dari MLP. Angka 6 yang berada ditengah-tengah gambar akan berhasil dikenali, tetapi angka 6 yang berada dipojok kiri mungkin tidak akan dikenali.

Kita bisa menggunakan data yang sangat banyak dengan tiap digit berada pada lokasi yang berbeda, namun ini bukan cara yang efisien untuk mengatasi permasalahan tersebut.


Convolutional Neural Network

Convolutional Neural Network (CNN) adalah salah satu jenis neural network yang biasa digunakan pada data image. CNN bisa digunakan untuk mendeteksi dan mengenali object pada sebuah image.

Secara garis besar CNN tidak jauh beda dengan neural network biasanya. CNN terdiri dari neuron yang memiliki weight, bias dan activation function seperti yang sudah kita pelajari pada part sebelumnya.

Lalu apa yang membedakan? Arsitektur dari CNN dibagi menjadi 2 bagian besar, Feature Extraction Layer (istilah saya sendiri :D) dan Fully-Connected Layer (MLP).

Credits : Matlab

Feature Extraction Layer

Saya gunakan istilah ini karena proses yang terjadi pada bagian ini adalah melakukan “encoding” dari sebuah image menjadi features yang berupa angka-angka yang merepresentasikan image tersebut (Feature Extraction).

Feature extraction layer terdiri dari dua bagian. Convolutional Layer dan Pooling Layer. Namun kadang ada beberapa riset/paper yang tidak menggunakan pooling.

Convolutional Layer (Conv. Layer)

CIFAR10 — Horse

Gambar diatas adalah RGB (Red, Green, Blue) image berukuran 32x32 pixels yang sebenarnya adalah multidimensional array dengan ukuran 32x32x3 (3 adalah jumlah channel).

Convolutional layer terdiri dari neuron yang tersusun sedemikian rupa sehingga membentuk sebuah filter dengan panjang dan tinggi (pixels). Sebagai contoh, layer pertama pada feature extraction layer biasanya adalah conv. layer dengan ukuran 5x5x3. Panjang 5 pixels, tinggi 5 pixels dan tebal/jumlah 3 buah sesuai dengan channel dari image tersebut.

Ketiga filter ini akan digeser keseluruh bagian dari gambar. Setiap pergeseran akan dilakukan operasi “dot” antara input dan nilai dari filter tersebut sehingga menghasilkan sebuah output atau biasa disebut sebagai activation map atau feature map.

Credits : CS231n

Stride

Stride adalah parameter yang menentukan berapa jumlah pergeseran filter. Jika nilai stride adalah 1, maka conv. filter akan bergeser sebanyak 1 pixels secara horizontal lalu vertical. Pada ilustrasi diatas, stride yang digunakan adalah 2.

Semakin kecil stride maka akan semakin detail informasi yang kita dapatkan dari sebuah input, namun membutuhkan komputasi yang lebih jika dibandingkan dengan stride yang besar.

Namun perlu diperhatikan bahwa dengan menggunakan stride yang kecil kita tidak selalu akan mendapatkan performa yang bagus.


Padding

Sedangkan Padding atau Zero Padding adalah parameter yang menentukan jumlah pixels (berisi nilai 0) yang akan ditambahkan di setiap sisi dari input. Hal ini digunakan dengan tujuan untuk memanipulasi dimensi output dari conv. layer (Feature Map).

Tujuan dari penggunaan padding adalah :

  • Dimensi output dari conv. layer selalu lebih kecil dari inputnya (kecuali penggunaan 1x1 filter dengan stride 1). Output ini akan digunakan kembali sebagai input dari conv. layer selanjutnya, sehingga makin banyak informasi yang terbuang.
    Dengan menggunakan padding, kita dapat mengatur dimensi output agar tetap sama seperti dimensi input atau setidaknya tidak berkurang secara drastis. Sehingga kita bisa menggunakan conv. layer yang lebih dalam/deep sehingga lebih banyak features yang berhasil di-extract.
  • Meningkatkan performa dari model karena conv. filter akan fokus pada informasi yang sebenarnya yaitu yang berada diantara zero padding tersebut.

Pada ilustrasi diatas, dimensi dari input sebenarnya adalah 5x5, jika dilakukan convolution dengan filter 3x3 dan stride sebesar 2, maka akan didapatkan feature map dengan ukuran 2x2. Namun jika kita tambahkan zero padding sebanyak 1, maka feature map yang dihasilkan berukuran 3x3 (lebih banyak informasi yang dihasilkan)


Untuk menghitung dimensi dari feature map kita bisa gunakan rumus seperti dibawah ini:

  • W = Panjang/Tinggi Input
  • N = Panjang/Tinggi Filter
  • P = Zero Padding
  • S = Stride

Pooling Layer

Pooling layer biasanya berada setelah conv. layer. Pada prinsipnya pooling layer terdiri dari sebuah filter dengan ukuran dan stride tertentu yang akan bergeser pada seluruh area feature map.

Pooling yang biasa digunakan adalah Max Pooling dan Average Pooling. Sebagai contoh jika kita menggunakan Max Pooling 2x2 dengan stride 2, maka pada setiap pergeseran filter, nilai maximum pada area 2x2 pixel tersebut yang akan dipilih, sedangkan Average Pooling akan memilih nilai rata-ratanya.

Max Pooling. Credits : CS231n
Dimensi output dari Pooling layer juga menggunakan rumus yang sama seperti pada conv. layer

Tujuan dari penggunaan pooling layer adalah mengurangi dimensi dari feature map (downsampling), sehingga mempercepat komputasi karena parameter yang harus diupdate semakin sedikit dan mengatasi overfitting.


Fully-Connected Layer (FC Layer)

Feature map yang dihasilkan dari feature extraction layer masih berbentuk multidimensional array, sehingga kita harus melakukan “flatten” atau reshape feature map menjadi sebuah vector agar bisa kita gunakan sebagai input dari fully-connected layer.

FC Layer yang dimaksud disini adalah MLP yang sudah pernah kita pelajari sama-sama pada part-4 dan part-5. FC Layer memiliki beberapa hidden layer, activation function, output layer dan loss function.


Yang penasaran dengan bagaimana backpropagation untuk CNN. Secara garis besar sama saja, yang sedikit berbeda adalah saat backprop pada conv. layer. Yang penasaran mungkin bisa baca lebih lanjut pada artikel dibawah ini


Let’s Code

Kali ini kita akan melakukan klasifikasi terhadap data Fashion MNIST. Fashion MNIST ini adalah dataset yang terdiri dari 10 kategori fashion sebagai berikut :

  • T-Shirt/Tops = 0
  • Trouser = 1
  • Pullover = 2
  • Dress = 3
  • Coat = 4
  • Sandal = 5
  • Shirt = 6
  • Sneaker = 7
  • Bag = 8
  • Ankle Boot = 9

Tiap kategori terdiri dari 6.000 images untuk training dan 1.000 images untuk testing. Jadi total untuk training data ada 60.000 images dan 10.000 untuk testing data.

Dependency & Data Preparation

Tidak jauh berbeda dengan part-part sebelumnya. Tapi kali ini kita akan gunakan layer baru yaitu Conv2D, MaxPooling2D, ZeroPadding2D dan Flatten. Kita juga akan gunakan TensorBoard untuk melakukan visualisasi pada saat training.

Input Fashion MNIST akan di-rescale dari 0–255 menjadi 0–1 seperti yang kita lakukan pada part-6 dan melakukan reshape data menjadi 4-D karena requirement dari framework yang kita gunakan adalah seperti itu (batch_size, width, height, channel) => (256, 28, 28, 1).

Target juga akan dirubah menjadi one-hot dengan menggunakan method to_categorical seperti yang sudah kita lakukan pada part-5.


The Model

CNN Model

Arsitektur model yang akan kita buat adalah seperti gambar diatas. Feature map yang berhasil di-extract dari input berukuran 3x3 sebanyak 64. Selanjutnya terdapat Flatten layer yang merubah feature map tersebut menjadi 1-D vector yang akan digunakan pada FC Layer.


Training with TensorBoard Visualization

Kita akan menggunakan TensorBoard untuk melakukan visualisasi pada saat training. Seluruh training loss/accuracy dan validation loss/accuracy akan disimpan dan kita bisa melihat grafiknya.

Dengan ini kita bisa melihat apakah terjadi underfit, overfit dan performa dari model kita. Mungkin nanti akan saya bahas di part terpisah tentang optimasi ini.


Setelah 100 epoch saya mendapatkan loss sebesar 0.2236 untuk training dan 0.3071 untuk validation, sedangkan accuracy yang didapat adalah 0.9186 (91.86%) untuk training dan 0.8891 (88.9%) untuk validation.

Untuk menggunakan TensorBoard kita bisa gunakan command sebagai berikut:

tensorboard — logdir=Graph/
TensorBoard Visualization

Deeper Network

Validation Accuracy 88.9% nanggung banget ya.. Gimana kalau kita ingin mendapatkan val accuracy setidaknya 90%?

Kita bisa gunakan arsitektur yang lebih “deep” dengan menambahkan conv. layer. Tapi yang patut diperhatikan adalah semakin deep arsitektur yang kita gunakan semakin lama proses training karena semakin banyak parameter yang harus diupdate. Arsitektur yang seperti ini juga rawan terjadi overfitting.

Deeper Network Model

Model kedua yang akan kita coba menggunakan ukuran filter yang sama yaitu 5x5 dan 3x3, namun kita gunakan stride yang lebih kecil dan kita melakukan dua kali downsampling.

Perlu diingat bahwa semakin kecil stride maka semakin banyak informasi yang dapat di-extract.


Comparing Two Model

Dengan menggunakan TensorBoard, kita juga bisa membandingkan performa kedua model yang telah kita train.

Deeper Network Performance

Grafik warna biru diatas adalah grafik dari model kedua yang menggunakan conv. layer yang lebih banyak. Bisa dilihat disitu kalau performa dari model ini jelas lebih bagus daripada model pertama.

Training dan Validation Loss yang didapatkan adalah 0.1521 dan 0.2571, sedangkan Training dan Validation Accuracy sebesar 94.46% dan 91.28%.

Sebenarnya kedua model ini masih bisa dioptimasi lagi, bisa dicoba pake learning rate yang lebih tinggi misalnya 0.001, tapi epoch lebih kecil lagi atau setting jumlah neuron pada FC Layer dan masih banyak lagi untuk improve performa dari model kita.


Complete Code


Pada part ini kita sudah sama-sama melihat implementasi CNN untuk melakukan klasifikasi pada image grayscale. Lalu bagaimana dengan RGB Image dengan object yang lebih kompleks?

Kita akan bahas itu semua pada part selanjutnya tentang Pre-Trained Model atau Transfer Learning..So Stay Tune Guys…:D