Klasifikasi MNIST menggunakan Convolutional Neural Network


Apa itu Convolutional Neural Network (CNN)? Ini bukan portal berita, tapi ini adalah jenis Jaringan Syaraf Tiruan (JST) yang katanya paling bagus dalam menghandle data gambar atau citra. Ini adalah jenis JST feed forward network sama seperti Multi Layer Perceptron (MLP) (pernah di bahas sebelumnya di beberapa artikel di blog ini, salah satunya adalah pengenalan mengenal MLP ada di sini). Lalu apa yang spesial dari CNN? sesuai dengan namanya, layer Convolutional yang membuat JST jenis ini spesial.

CNN mempelajari pola-pola unik dari feature citra. Mula-mula CNN akan belajar feature yang paling sederhana seperti garis tepi, yang kemudian dari kompulan garis tepi CNN akan mempelajari suatu bentuk sederhana dan dari bentuk sederhana itu CNN bisa mempelajari bentuk yang lebih kompleks sehingga bisa belajar membedakan suatu citra dengan citra lainnya. Semua ini memungkinkan karena adanya convolutional layer pada CNN.


Selain Convolutional layer, masih ada layer lain yang spesial ada pada CNN seperti pooling layer dan  ReLU layer. Pembahasan mendalam mengenai CNN dan layer-layernya akan dibahas pada postingan terpisah.

Well, tapi kan komputer tidak tahu kalau masukan itu suatu data citra atau bukan. Komputer melihat data citra sebagi sekumpulan data yang kebetulan berbentuk matriks persegi/persegi panjang. Jadi menurut saya pribadi, selama data itu benar-benar ada polanya, CNN pasti bisa menangkap dan 'mempelajari'nya. Oleh karena itulah CNN dimanfaatkan bukan hanya untuk pemrosesan citra. CNN juga dimanfaatkan untuk Natural Languange Processing (NLP), bot game, dan drug discovery.

Di pembahasan kali ini, kita akan coba mengetes performa dari CNN untuk klasifikasi gambar MNIST. MNIST lagi...bosan! Well, niat awal saya sebenarnya ingin klasifikasi gambar arbitary yang berwarna tapi apa daya, untuk melakukan itu komputasi yang diperlukan sangatlah berat. Hanya untuk 100 data training gambar berwarna dengan dimensi sekitar 400 x 400 butuh RAM 6 gb. RAM di komputer saya hanya 4 GB sehingga tidak mampu menjalankan training datanya.

Sepertinya script saya bisa di optimasi untuk mengatasi kebutuhan RAM ini tapi karena terlalu merepotkan jadi yah sudahlah, kapan-kapan saja buatnya~

Library yang saya pakai di sini seperti biasa adalah tensorflow dengan tambahan Keras. Keras adalah library wrapping tensorflow dan theano. Walaupun tensorflow adalah library high level, paradigma tensorflow dalam membangun model JST terkadang bisa sangat merepotkan. Oleh karena itu, Keras membuatnya 'lebih high level lagi' sehingga pembuatan model JST menjadi jauh lebih mudah lagi.

Untuk menginstall keras pada Ubuntu, cukup dengan perintah

Pastikan sebelum install keras, tensorflow atau theano harus terlebih dahulu terinstall. Keras hanyalah wrapping tensorflow dan theano.

Setelah itu download data MNIST yang akan kita gunakan untuk percobaan kali ini. Data tersebut bisa di download di sini. Data tersebut dalam bentuk tar.gz sehingga harus di ekstrak terlebi dahulu.

Script yang kita gunakan ada di bawah ini. Jika tidak kelihatan, bisa di download di sini. Di sini kita mencoba menklasifikasikan digit 0, 1, 2, dan 3. Variabel data0, data1, data2, dan data3 silahkan ganti dengan alamat tempat kumpulan data digit 0, 1, 2, dan 3 berada (data yang MNIST telah di download sebelumnya).



Sekarang akan dijelaskan setiap bagian dari script ini.

Pertama kita membaca data MNIST dan di ekstrak ke dalam bentuk matriks 3 dimensi (total gambar x panjang x lebar).


Lalu setelah itu, nilai dari matriks yang kita dapatkan di normalisasi dengan membagi semua nilainya dengan 255 (nilai tertinggi yang bisa didapatkan).

Setelah itu kita masukan data training pada model yang sudah kita desain.
Model CNN ini didapatkan dari sini.
Setelah memasukkan data training, kita uji kehandalan model CNN dengan memasukkan data test dan diukur berapa persen errornya.

Hasilnya adalah

Luar biasa, tanpa celah sama sekali. Tapi hasil ini bisa berbeda jika kita jalankan lagi. Contoh berikut hasil running kedua kalinya.

Benar kan. Itu karena sama seperti JST pada umumnya, bobot JST pada awalnya di initialisasi menggunakan angka acak sehingga perjalanan menuju ke konvergenan dari setiap kali running akan sedikit berbeda jika model JST yang kita pakai adalah model yang baik.

Di percobaan ini ada kita menggunakan 80 data test, artinya pada percobaan kedua (error 1.25%) tadi CNN salah menklasifikasikan 1 kasus saja. Berbeda tipis dengan yang percobaan pertama yang benar semua tebakannya.

Pada postingan kali ini kita hanya mengetes kehandalan CNN. Real action dari penggunaan CNN mungkin akan dibahas lain waktu. Sekian.

referensi:
https://www.researchgate.net/figure/ConvNet-Architecture-used-for-Automatic-Feature-Learning-to-Detect-Shadows_fig2_282477990, di akses pada 15 Februari 2018
https://github.com/myleott, di akses pada 15 Februari 2018
https://en.wikipedia.org/wiki/Convolutional_neural_network, di akses pada 15 Februari 2018
https://stackoverflow.com/questions/45933434/is-there-a-way-to-display-the-feature-maps-in-the-tensorflow-object-detection-ap, di akses pada 15 Februari 2018
https://machinelearningmastery.com/handwritten-digit-recognition-using-convolutional-neural-networks-python-keras/, di akses pada 15 Februari 2018

Komentar

  1. Mau bertanya : list program saya error:
    print np.shape(trainlabel)
    ^
    SyntaxError: invalid syntax

    Mohon info solusinya

    BalasHapus

Posting Komentar