Apa itu Neural Network dan Deep Learning?

(Artificial) Neural network adalah sebuah model yang terinspirasi dari proses kerja otak manusia. Tiap neuron dalam otak manusia saling berhubungan dan informasi mengalir dari setiap neuron tersebut.

Deep Learning adalah salah satu cabang keilmuan dari Machine Learning (ML) yang menggunakan Deep Neural Network untuk menyelesaikan permasalahan pada domain ML.

Beberapa kegunaan dari Deep Learning adalah sebagai berikut:

Framework Deep Learning Populer

Saat ini kita mengenal cukup banyak framework untuk penggunaan deep learning. Beberapa yang cukup populer di antaranya adalah: Tensorflow, Keras, MXNet, dan PyTorch.

Berikut adalah grafik tingkat kepopuleran framework deep learning dari 2014 hingga 2017 (data lama):

Berkenalan dengan Keras

Pada analisis ini, saya hanya akan menggunakan framework Keras dengan bantuan R interface dari RStudio.

Keras adalah high-level neural network API yang dikembangkan dengan Python dengan fokus tujuan untuk mempercepat proses riset atau percobaan.

Beberapa fitur utama dari Keras:

Spesifikasi untuk menggunakan Tensorflow

Tensorflow sebagai back-end utama dari Keras mempunyai minimum persyaratan sebagai berikut:

Untuk versi Python yang didukung adalah: v3.4, v3.5, dan v3.6

PERHATIAN: Tensorflow akan memiliki masalah pada Python v3.7

Dataset Fashion MNIST

Dataset yang saya gunakan untuk proses pembelajaran neural network ini adalah Fashion MNIST. Dataset ini merupakan sebuah kumpulan 70,000 buah gambar hitam-putih yang memiliki 10 kategori dan direpresentasikan dalam sebuah pixel berukuran 28x28.

Pre-processing

Saya menggunakan library keras yang tersedia dari CRAN dan data.table untuk keperluan pre-processing data. Library data.table menyediakan fungsi fread() untuk mempercepat proses pembacaan data khususnya untuk data yang berukuran besar.

library(keras)
library(data.table)

fashion_train <- fread("data_input/fashionmnist/train.csv")
fashion_test <- fread("data_input/fashionmnist/test.csv")
dim(fashion_train)
## [1] 60000   785
dim(fashion_test)
## [1] 10000   785

Saya menggunakan 60,000 gambar sebagai data train untuk melatih model neural network dan 10,000 gambar sebagai data test untuk menguji tingkat akurasi dari model tersebut untuk mengklasifikasikan gambar yang ada.

Supaya dapat direpresentasi sebagai kisaran nilai antara 0 sampai 1, maka masing-masing data train dan test terlebih dahulu dijadikan matriks, lalu dibagi dengan 255 (nilai terbesar sebuah piksel)

x_train <- data.matrix(fashion_train[,-1]) / 255
x_test <- data.matrix(fashion_test[,-1]) / 255
dim(x_train)
## [1] 60000   784
dim(x_test)
## [1] 10000   784

y_train dan y_test adalah sebuah label klasifikasi untuk 10 buah jenis gambar yang ada

y_train <- fashion_train$label
y_test <- fashion_test$label
str(y_train)
##  int [1:60000] 2 9 6 0 3 4 4 5 4 8 ...
str(y_test)
##  int [1:10000] 0 1 2 2 3 2 8 6 5 0 ...

Mempersiapkan model menggunakan fungsi keras_model_sequential() bawaan dari library keras. Model deep learning ini terdiri dari beberapa layer yang dirangkai bersama dalam satu buah model.

model <- keras_model_sequential()
# model %>% 
#   layer_dense(units = 256, activation = "relu", input_shape = c(784)) %>% 
#   layer_dropout(rate = 0.4) %>% 
#   layer_dense(units = 128, activation = "relu") %>% 
#   layer_dropout(rate = 0.3) %>% 
#   layer_dense(units = 10, activation = "softmax")

model %>% 
  layer_flatten(input_shape = c(784)) %>% 
  layer_dense(units = 128, activation = "relu") %>% 
  layer_dense(units = 10, activation = "softmax")

summary(model)
## ___________________________________________________________________________
## Layer (type)                     Output Shape                  Param #     
## ===========================================================================
## flatten (Flatten)                (None, 784)                   0           
## ___________________________________________________________________________
## dense (Dense)                    (None, 128)                   100480      
## ___________________________________________________________________________
## dense_1 (Dense)                  (None, 10)                    1290        
## ===========================================================================
## Total params: 101,770
## Trainable params: 101,770
## Non-trainable params: 0
## ___________________________________________________________________________

Sebelum model siap untuk proses training, dibutuhkan beberapa pengaturan melalui fungsi compile(), di antaranya:

model %>% compile(
  loss = "sparse_categorical_crossentropy",
  optimizer = optimizer_rmsprop(),
  metrics = c("accuracy")
)

Proses training dalam model neural network memerlukan tahapan sebagai berikut:

Untuk memulai proses training digunakan fungsi fit()

history <- model %>% fit(
  x_train, y_train,
  epochs = 5
)

Dari hasil train tersebut, didapat nilai akurasi sekitar 93%.

Kemudian kita bandingkan tingkat akurasi dari dataset test menggunakan fungsi evaluate()

model %>% evaluate(x_test, y_test)
## $loss
## [1] 0.330378
## 
## $acc
## [1] 0.8847

Didapat nilai akurasi dari data test sedikit lebih kecil dari data training. Adanya perbedaan nilai akurasi ini merupakan contoh dari overfitting yang artinya sebuah model machine learning memiliki performa yang lebih buruk pada data baru dibandingkan dengan data training.

Membuat Prediksi

Dengan model yang sudah di-train, saya dapat melakukan prediksi beberapa gambar berdasarkan 10 kategori yang sudah disiapkan.

Fungsi predict_classes() digunakan untuk memprediksi klasifikasi dari masing-masing data.

categories = c('T-shirt',
                'Trouser',
                'Pullover',
                'Dress',
                'Coat', 
                'Sandal',
                'Shirt',
                'Sneaker',
                'Bag',
                'Boot')

class_pred <- model %>% predict_classes(x_test)
table(class_pred)
## class_pred
##    0    1    2    3    4    5    6    7    8    9 
## 1107 1028 1040  980 1021  960  827 1024  987 1026

Fungsi plotResults() digunakan untuk membuat plot beberapa gambar disertai dengan nilai prediksi mereka dalam bentuk kategori angka

plotResults <- function(images) {
  x <- ceiling(sqrt(length(images)))
  par(mfrow = c(x,x), mar = c(.1,.1,.1,.1))
  
  for (i in images) {
    m <- matrix(x_test[i,], nrow = 28, byrow = TRUE)
    m <- apply(m, 2, rev)
    image(t(m), col = grey.colors(255), axes = FALSE)
    
    predicted_label <- class_pred[i]
    true_label <- y_test[i]
    
    if(predicted_label == true_label) {
      color <- "green"
    } else {
      color <- "red"
    }
    
    text(0.5, 0.1, col = color, cex = 1.5, categories[predicted_label+1])
  }
}
plotResults(1:100)

Kesimpulan

References