Handwritten Chinese Digit Recognizer with Convolutional Neural Network

https://miro.medium.com/max/1200/0*UohuBDO8QmYSc7_P

Original Source Here

Handwritten Chinese Digit Recognizer with Convolutional Neural Network

Chinese Digit MNIST (Source: Kaggle) (Gabriel Preda — CC0)

Permasalahan Handwritten Character Recognition atau biasa disingkat dengan HCR adalah salah satu masalah menarik dan menjadi salah satu bidang penelitian yang menantang dalam pemrosesan gambar beberapa tahun terakhir (Pradeep et al., 2011). Salah satu masalah yang tergabung dalam HCR adalah tulisan Mandarin. Masalah tersebut dinamakan Handwritten Chinese Character Recognition atau biasa disingkat dengan HCCR. Permasalahan HCCR secara luas sudah dipelajari selama lebih dari 40 tahun (Zhong et al., 2015). Hingga saat ini, sudah ada sekitar seperempat dari populasi dunia membaca dan menulis dalam aksara Cina (Zhong et al., 2015). Maka dari itu, pemrosesan informasi pada tulisan Mandarin akan membawa manfaat yang cukup besar dalam komersial dan sosial (Aleskerova & Zhuravlev, 2020).

Data yang digunakan adalah data dari MNIST yang bisa diakses pada tautan ini. Data yang disediakan terdiri dari dua jenis. Data pertama adalah kumpulan citra tulisan tangan sebanyak 12.000 citra dengan tiap citra berukuran 64×64 piksel. Data kedua adalah file dengan format csv (comma separated values) yang berisi tabel terkait indeks yang mengacu pada suatu citra dan nilai angka dari citra tersebut. Model yang akan digunakan adalah salah satu model Setiap piksel dari tiap citra akan dimasukkan ke dalam salah satu model neural network, yakni model CNN (Convolutional Neural Network). Setiap piksel pada citra akan dimasukkan sebagai masukan ke dalam model tersebut untuk menjalani proses pelatihan model dengan feedforward dan backpropagation. Hasil akhir dari model CNN adalah klasifikasi pengenalan citra tulisan tangan digit angka dalam bahasa Mandarin.

Exploratory Data Analysis

Data yang digunakan berupa citra yang ada di MNIST database. MNIST adalah singkatan dari Modified National Institute of Standards and Technology. MNIST database menyediakan data citra dengan jumlah yang sangat besar. Citra tersebut berupa gambar digit angka. Database ini banyak digunakan dalam machine learning terkait proses training dan testing.

Keseimbangan kelas pada data sangat penting mengingat masalah yang dihadapi adalah klasifikasi. Sebaiknya, jumlah data pada tiap kelas sebisa mungkin sama satu sama lain. Keseimbangan data bisa berdampak dari performa model yang dikembangkan. Data yang tidak seimbang akan membuat model cenderung membuat prediksi ke kelas yang dominan. Berikut adalah jumlah data untuk setiap kelas.

Gambar 1: jumlah data pada tiap kelas dataset

Berdasarkan bar plot di atas, terlihat bahwa jumlah data tiap kelas sudah hampir sama banyak. Hal tersebut merupakan berita yang cukup baik karena bisa langsung menggunakan metrik yang biasa digunakan pada permasalahan klasifikasi, seperti akurasi, presisi, recall, dan nilai F1. Dari plot di atas terlihat kelas dengan jumlah data terbanyak adalah kelas 0, sementara kelas dengan jumlah data paling sedikit adalah kelas 10000.

Data Preparation

Data citra berupa tulisan dalam bahasa Mandarin bernilai 0 sampai 255 untuk setiap pikselnya. Tiap piksel dilakukan pengaturan skala ulang. Nilai piksel akan dikurangi dengan rata-rata piksel dan dibagi standar deviasi dari semua piksel. Hal tersebut dinamakan dengan standardisasi. Tanpa standardisasi, nilai piksel mentah ketika dimasukkan ke dalam jaringan akan memperlambat pembelajaran karena sifat input yang tidak menentu. Berikut adalah perbandingan antara citra sebelum dilakukan standardisasi dan setelah dilakukan standardisasi.

# standardize every pixel in all images
X_scaled = (X - np.mean(X))/np.std(X)
Gambar 2: perbandingan citra sebelum dan setelah dilakukan standardisasi

Citra sebelum dilakukan standardisasi terlihat kurang begitu jelas, garis yang tipis, dan kontras yang kecil. Berikutnya, citra setelah standardisasi terlihat lebih jelas dengan garis lebih tegas. Namun, citra terlihat memiliki noise berupa titik-titik yang mengelilingi objek.

Setelah normalisasi, data target perlu ditransformasi menjadi data kategori. Keluaran dari model adalah probabilitas untuk setiap kelas digit. Maka dari itu, diperlukan teknik one-hot encoding. Teknik one-hot encoding mengubah setiap nilai dari target menjadi sebuah vektor berdimensi |C| untuk C merupakan kelas data. Nilai dari vektor adalah 0 kecuali jika nilai target sama dengan kelas c yang berada pada indeks i, maka vektor dengan indeks i bernilai 1.

Data Modeling

Convolutional Neural Network (CNN) adalah salah satu arsitektur dari deep learning yang menerima input data, biasanya berupa citra (Brownlee, 2020). CNN merupakan neural network yang didesain khusus untuk mengenali pola citra secara visual berdasarkan piksel-piksel dengan preprocessing yang minimal (Hossain & Ali, 2019). Menurut Hossain dan Ali (2019) dari beberapa layer yang bisa digunakan, tiga layer paling utama adalah convolutional layer, pooling layer, dan fully-connected layer (MLP). Untuk mengetahui lebih jauh terkait arsitektur CNN, bisa cek tautan ini. Arsitektur yang digunakan dalam menyelesaikan permasalahan ini diadopsi dari arsitektur LeNet. Salah satu komponen dari LeNet diubah, misalnya fungsi aktivasi dari sigmoid menjadi ReLu.

LeCun et al., LeNet-5 Architecture, 1998. “Gradient based learning applied to document recognition

Reducing Variance

Penggunaan multilayer perceptron dengan dense layer bisa membuat variance dari model menjadi tinggi. Dengan begitu, diperlukan proses dropout ketika model sedang berada pada fully-connected layer. Dengan menambahkan proses dropout, beberapa neuron pada fully-connected layer secara acak akan tidak digunakan pada epoch tertentu saat training model. Diharapkan model akan menjadi lebih general semenjak tidak terlalu bergantung pada tiap neuron dalam menentukan prediksi keluaran. Pada model ini, parameter yang diterapkan pada Dropout layer adalah 20%.

Handling Bias

Berikut adalah cara yang digunakan untuk meningkatkan akurasi pada permasalahan menangani bias dari model yang sedang dibangun.

  • Layer lebih banyak — pada model LeNet yang asli menggunakan 2 convolutional layers. Pada model yang dikembangkan, terdapat 2 convolutional layers tambahan dengan parameter yang sama dengan layer sebelumnya.
  • Network lebih dalam — Jumlah filter meningkat secara signifikan dari 6 menjadi 32 pada 2 layers pertama dan 16 menjadi 64 pada 2 layers berikutnya. Selain itu, dense layer juga ditambahkan untuk mengakomodasi jumlah masukan yang lebih besar akibat penambahan convolutional layers.

Dari dua hal di atas, diharapkan model bisa mempelajari karakteristik yang membedakan fitur-fitur kompleks dari tulisan tangan dengan model yang lebih dalam dan rapat.

Dari beberapa penjelasan di atas, berikut adalah model yang dikembangkan. Pada model, terdapat 12 layers dengan rincian masing-masing 4 convolutional layer, 4 pooling layer, dan 4 dense layer dengan 1 dropout.

model = Sequential()# layer 1
model.add(Conv2D(filters=32, kernel_size=(5,5), input_shape=X_train.shape[1:], padding = 'same', activation='relu'))
# layer 2
model.add(MaxPool2D(pool_size=(2, 2)))
# layer 3
model.add(Conv2D(64, kernel_size = (5, 5), activation = 'relu', padding = 'same'))
# layer 4
model.add(MaxPool2D(pool_size = (2, 2)))
# layer 5
model.add(Conv2D(64, kernel_size = (5, 5), activation = 'relu', padding = 'same'))
# layer 6
model.add(MaxPool2D(pool_size = (2, 2)))
# layer 7
model.add(Conv2D(164, kernel_size = (5, 5), activation = 'relu', padding = 'same'))
# layer 8
model.add(MaxPool2D(pool_size = (2, 2)))
# layer 9
model.add(Flatten())
# layer 10.1
model.add(Dense(128, activation='relu'))
# layer 10.2
model.add(Dropout(0.2))
# layer 11
model.add(Dense(256, activation = 'relu'))
# layer 12
model.add(Dense(15, activation='softmax'))

Setelah menyusun layer yang digunakan pada model, tahap selanjutnya adalah mengatur bagaimana model bisa belajar dari data masukan yang diberikan. Pada tahap ini memilih jenis optimizer, perhitungan loss, dan metric pengukuran model yang digunakan. Pada model, dipilih ADAM optimizer karena menggabungkan properti terbaik dari AdaGrad dan RMSProp sehingga dapat menangani masalah noise pada data. Selain itu, loss function yang digunakan adalah categorical_crossentropy karena permasalahan yang sedang ditangani adalah multiclass classification. Terakhir, metrics yang digunakan akurasi.

# model learning setup
model.compile(optimizer='adam', loss='categorical_crossentropy'
metrics=['accuracy'])
Gambar 3: struktur model yang dikembangkan

Setelah pengaturan model selesai, model siap digunakan untuk menangani permasalahan. Salah satu hyperparameter dalam proses pelatihan model adalah epochs. Perlu diperhatikan karena nilai epochs yang terlalu kecil membuat model underfits, namun nilai epochs yang terlalu besar membuat model overfits. Untuk kasus ini, bisa dicoba-coba saja selagi model yang dibangun tidak terlalu kompleks. Di sini, nilai epochs yang digunakan adalah 50.

history2 = model.fit(X_train, y_train_cat, validation_data=(X_test,y_test_cat), epochs=50)

Model Evaluation

Chinese Digit sebagai Ground Truth(Source: Amino Apps) (Verdaj Steloj)

Setelah melatih model dengan data training, model perlu dilakukan evaluasi untuk mengecek sudah seberapa baik performa yang diberikan. Maka dari itu, ada beberapa metrik yang perlu dianalisis, seperti accuracy, recall, precision, dan f1-score. Sebelum itu, model memprediksi data testing dan akan dibandingkan dengan ground truth dari data asli.

# predict the data test
y_pred = compute_ypred(model, X_test)
print(classification_report(y_test, y_pred))
Gambar 4: classification report dari performa model

Berdasarkan hasil classification report di atas, terlihat bahwa hasil akurasi model mencapai 99%. Hal tersebut sudah sangat baik. Selain itu, nilai f1-score yang didapatkan untuk tiap kelas dataset berada pada rentang 0.98–1.00. Dengan begitu, dapat disimpulkan juga bahwa nilai recall dan precision sudah tinggi dan tidak memiliki selisih yang jauh berbeda. Semenjak dataset sudah balanced, maka keempat metrik tersebut valid untuk digunakan. Dengan demikian, model yang dibangun bisa dikatakan sudah sangat baik.

Kemudian, melihat jumlah citra dan citra mana saja yang salah diprediksi terlihat cukup menarik.

plt.figure(figsize=(20,20))i = 0# show the misclassified images
for idx, (prediction, label) in enumerate(zip(y_pred, y_test)):
if prediction != label:
i += 1
plt.subplot(4,5,i)
plt.title('Actual label: {}\nPredicted label: {}'.format(y_test[idx], y_pred[idx]))
plt.imshow(X_test[idx,:,:,:])
plt.axis('off')
plt.show()
Gambar 5: citra -citra yang salah diprediksi

Berdasarkan gambar ground truth dan hasil yang salah diprediksi, model paling banyak melakukan kesalahan pada kelas 10 dan 1000. Hal tersebut bisa jadi karena kedua tulisan tersebut cukup mirip dan hanya beda garis vertikal di atas. Selain itu, angka 2 dan 3 juga banyak terjadi kesalahan prediksi. Noise yang timbul di sekitar objek citra akibat standardisasi bisa saja menyebabkan model secara samar-samar menebak banyak garis yang ada. Sisanya terlihat memang beberapa objek citra tidak ditulis secara jelas sehingga model salah memprediksi hasilnya.

Berikut adalah grafik terkait loss dan accuracy dari model selama proses pembelajaran pada epoch.

Gambar 6: grafik akurasi tiap epoch
Gambar 7: grafik loss tiap epoch

AI/ML

Trending AI/ML Article Identified & Digested via Granola by Ramsey Elbasheer; a Machine-Driven RSS Bot

%d bloggers like this: