Eksperimen dengan MNIST : Digit & Fashion Database

Saya membuat eksperimen sederhana memakai 1-Nearest Neighbor Classifier memakai MNIST Handwritten Digit & MNIST Fashion Database.  Saya buat code sederhana, tanpa melakukan ekstraksi fitur, normalisasi input dan berbagai proses yang lain. Hanya memakai nilai intensitas tiap pixel sebagai fitur. Tentu bukan cara yang baik, tapi ini hanya sekedar coba-coba awal saja. Confusion matrix kedua eksperimen saya rangkumkan dalam dua tabel berikut

Tabel 1  Hasil eksperimen 1-Nearest Neighbor Classification pada  MNIST Handwritten Digit Database

Screen Shot 2017-11-11 at 9.05.45 AM

Tabel 2  Hasil eksperimen 1-Nearest Neighbor Classification pada Fashion MNIST Database

Screen Shot 2017-11-11 at 9.03.33 AM

Ternyata hasil eksperimen dengan kedua dataset tersebut memperlihatkan bahwa Fashion MNIST Database relatif lebih sulit daripada MNIST Handwritten Database, dengan selisih akurasi sekitar 12% ( 85.0% vs 96.9% ). Sebagai perbandingan,  tingkat akurasi terbaik saat ini yang dilaporkan adalah 96.7%  (per 11 Nov 2017) untuk Fashion MNIST Database (Pls.see  https://github.com/zalandoresearch/fashion-mnist ).

Analisis lebih lanjut dari Tabel 2 di atas, memperlihatkan bahwa class yang recall-nya relatif rendah adalah class 4 (Coat) dan 6 (Shirt).  Akan menarik jika dilanjutkan dengan analisa lebih mendalam. Tapi biarlah ini jadi PR untuk murid-murid saya 🙂

Iklan
Dipublikasi di kuliah, research | Meninggalkan komentar

Fashion MNIST Database

Di group INAPR (Indonesian Association for Pattern Recognition), saya mendapat masukan dari sahabat saya, Prof. Pitoyo Hartono, bahwa selain MNIST Handwritten Digit Database, belakangan ini ada database baru yang disebut Fashion MNIST Database. Database ini dapat didownload dari https://www.kaggle.com/zalando-research/fashionmnist

Database ini memiliki format yang sama persis dengan MNIST Database, bahkan nama file pun sama, sehingga program yang saya buat kemarin dapat dipakai tanpa modifikasi sedikit pun. Tiap citra berukuran 28×28, 1 byte per pixel, sama persis dengan MNIST database. Yang membedakan adalah, kalau MNIST database memiliki 10 class, yaitu label untuk tiap tulisan angka : 0, 1, …, 9, maka Fashion MNIST Database memiliki 10 class juga, yaitu:

  • 0 T-shirt/top
  • 1 Trouser
  • 2 Pullover
  • 3 Dress
  • 4 Coat
  • 5 Sandal
  • 6 Shirt
  • 7 Sneaker
  • 8 Bag
  • 9 Ankle boot

Total sampel data testing adalah 10 ribu. Tabel 1 menampilkan jumlah sampel tiap class.

Tabel 1   Jumlah sampel tiap class pada Fashion MNIST Database

Screen Shot 2017-11-11 at 10.33.08 AM

Citra tersebut berasal dari artikel Zalando, sebuah perusahaan e-commerce yang bergerak di bidang fashion. Salah satu motivasi pembuatan dataset tersebut, karena database MNIST dianggap terlalu mudah ( pls. see https://github.com/zalandoresearch/fashion-mnist ) sehingga kurang memberikan kesempatan untuk melakukan testing performa berbagai model klasifikasi modern.

Selain program yang kemarin sudah saya buat, kali ini saya tambahkan satu program lagi untuk menampilkan citra dan class pada urutan yang diinginkan.  Screenshot source code dilampirkan di bawah. Sedangkan cara pemakaiannya adalah sebagaimana dalam gambar berikut. Tempatkan data training dan testing, baik citra maupun labelnya pada satu direktori dengan program print-one. c. Kemudian compile dan jalankan sebagaimana contoh berikut:

Screen Shot 2017-11-10 at 9.54.46 PM

Pada contoh di atas, akan diekstrak data citra pada urutan ke 7, yang kebetulan juga class ke-7, yaitu citra “Sneaker”. Nama file citra yang dihasilkan adalah “one.pgm”. Pada contoh di atas, citra yang dihasilkan adalah sebagai berikut (sudah diperbesar agar terlihat lebih jelas)

Screen Shot 2017-11-10 at 10.02.45 PM

Source code : print-one.c

Screen Shot 2017-11-10 at 9.51.21 PM

Dipublikasi di kuliah, research | 3 Komentar

Kelas Pattern Recognition : Eksperimen dengan MNIST Handwritten Digit Database

Kemarin sore saya memberikan tugas praktikum ke murid-murid di kelas “Introduction to Pattern Recognition” yaitu Kelas ICT semester 5 di SGU. Tugas praktikum tersebut adalah melakukan eksperimen memakai handwritten digit database MNIST untuk membangun model klasifikasi untuk pengenalan tulisan tangan.  Tujuan dari praktikum ini adalah agar mereka mencoba mempratekkan berbagai teori yang selama ini telah dipelajari memakai database riil yang cukup besar.  Selama ini mereka telah belajar beberapa teknik dasar Pattern Recognition, seperti k-Nearest Neighbor Classifier, Naive bayes, Artificial Neural Network dg backpropagation algorithm, k-Means Clustering dan Hierarchical Clustering. Di kelas, selain aspek teori, mereka saya minta juga mendevelop program dari scratch agar benar-benar memahami algoritma yang dipakainya. Sebagian memakai C, ada juga yang Java dan Python. Saya bebaskan, asal membuat dari scratch.  Tidak sekedar memakai tool, atau library yang sudah ada.

Data MNIST dapat didownload dari :  http://yann.lecun.com/exdb/mnist/
Pada situs di atas terdapat 4 file : “train-images-idx3-ubyte.gz”, “train-labels-idx1-ubyte.gz”, “t10k-images-idx3-ubyte.gz”, dan “t10k-labels-idx1-ubyte.gz”.  Data training dapat dibuat dengan memakai file “train-images-idx3-ubyte.gz” dan “train-labels-idx1-ubyte.gz”. Total sampel data training adalah 60 ribu. Sedangkan data testing dapat dibuat dari file “t10k-images-idx3-ubyte.gz”, dan “t10k-labels-idx1-ubyte.gz”. Total sampel data testing adalah 10 ribu. Tabel 1 menampilkan jumlah sampel tiap class.

Tabel 1   Jumlah sampel tiap class pada MNIST Handwritten Digit Database

Screen Shot 2017-11-11 at 10.27.16 AM

Format data MNIST dijelaskan pada situs di atas. Tiap sampel berukuran  28 pixel x 28 pixel. Karena satu pixel direpresentasikan dengan 1 byte, maka total ukuran per sampel adalah  784 bytes. File “train-images-idx3-ubyte.gz” setelah diunzip akan diperoleh file “train-images-idx3-ubyte” berukuran 47040016 bytes. File ini terdiri dari 2 bagian : header dan raw data sebanyak 60 ribu sampel. Header file  berukuran 16 byte. Sedangkan raw data berukuran : 784 bytes x 60 ribu = 47040000 bytes. Sehingga total ukuran file adalah 47040016 bytes.

File “train-labels-idx1-ubyte.gz”  setelah diunzip akan diperoleh file “train-labels-idx1-ubyte” berukuran 60008 bytes. File ini terdiri dari 2 bagian : header dan data label sebanyak 60 ribu label. Header file  berukuran 8 byte, sedangkan data label berukuran 1 byte.  Sehingga total ukuran file adalah 8 + 60 ribu = 60008 bytes.

Contoh ekstraksi tiap data citra dari data “train-images-idx3-ubyte” dan data label  “train-labels-idx1-ubyte” dijelaskan sebagai berikut.

  1. Melakukan ekstraksi tiap data citra  dari file “train-images-idx3-ubyte.gz”, label dari “train-labels-idex1-ubyte.gz”, dan menyimpan dalam tiap citra angka itu sebagai sebuah pgm file ke dalam folder sesuai dengan labelnya.
    Screenshot sourcecode “mnist-readchar.c” diupload di bagian bawah. Cara pemakaiannya adalah sebagaimana ditampilkan pada gambar berikut. Setelah selesai dijalankan, di tiap folder 0 sampai 9 terdapat ribuan pgm file yang masing-masing menampilkan angka sesuai dengan nama folder. Misalnya di dalam folder “0”, terdapat file “1.pgm”, “2.pgm”, … , “5923.pgm” yang semua memperlihatkan angka “0”. Dalam folder “1” terdapat file “1.pgm”, “2.pgm”, …, “6742.pgm”, dan seterusnya.
    Screen Shot 2017-11-10 at 10.59.28 PM
    Contoh salah satu file dalam folder “4” adalah sebagai berikut ( sudah diperbesar dari 28×28 menjadi 100×100 agar mudah terlihat)
  2. Melakukan ekstraksi tiap data citra angka dari file “train-images-idx3-ubyte.gz”, label dari “train-labels-idex1-ubyte.gz”, dan menyimpannya ke dalam csv file.
    Screenshot sourcecode “mnist-create-csv.c” diupload di bagian bawah. Cara pemakaiannya adalah sebagaimana ditampilkan pada gambar berikut
    Screen Shot 2017-11-10 at 11.03.30 PM
    Setelah selesai dijalankan, akan diperoleh file “mnist-train.csv” yang terdiri dari 60 ribu baris. Tiap baris terdiri dari 785 angka dengan rentang [0, 255] yang dipisahkan dengan koma. 784 angka pertama menunjukkan nilai intensitas tiap pixel, sedangkan angka terakhir menunjukkan labelnya. Screenshot di atas memperlihatkan cara mengecek angka pada kolom ke 785, yaitu label data, memakai command “cut” di Linux. Lima data pertama adalah angka “5”, “0”, “4”, “1” dan “9”.

Untuk ekstraksi data testing dapat dilakukan dengan cara yang sama, hanya saja perlu penyesuaian SAMPLE_NUM dari 60000 menjadi 10000, dan nama file diubah dengan “t10k-images-idx3-ubyte.gz”, dan “t10k-labels-idx1-ubyte.gz.

Screenshot Source Code (dalam bahasa C, dijalankan di Linux Ubuntu 17.04)

1. Source code filename : “mnist-readchar.c”

Screen Shot 2017-11-10 at 10.48.52 PM

2. Source code filename : “mnist-create-csv.c”

Screen Shot 2017-11-10 at 11.06.03 PM

 

Dipublikasi di kuliah, research | Meninggalkan komentar