(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:
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):
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:
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 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.
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:
loss : untuk mengukur seberapa akurat model selama proses training.optimizer : untuk meliaht bagaimana model berubah berdasarkan data yang dilihat dan juga loss function nya.metrics : untuk memantau tiap langkah dalam proses training dan testing. Pada analisis ini digunakan accuracy, seberapa akurat gambar-gambar yang berhasil diklasifikasikan dengan benar.model %>% compile(
loss = "sparse_categorical_crossentropy",
optimizer = optimizer_rmsprop(),
metrics = c("accuracy")
)
Proses training dalam model neural network memerlukan tahapan sebagai berikut:
x_train dan y_trainx_train dan label y_trainx_testUntuk 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.
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)