Deep Learning Using R-Convolutional Neural Network(CNN)
Assalamualaikum Warahmatullahi Wabarakatuh.
Pada kesempatan ini akan dibahas Convolutional Neural Network (CNN) dengan MNIST database menggunakan R.
MNIST Database adalah database dari tulisan tangan angka yang umum digunakan untuk melatih berbagai pengolahan sistem. Database ini juga banyak digunakan untuk pelatihan dan pengujian di bidang machine learning.
Deep Learning
Deep learning atau sering dikenal dengan istilah pembelajaran struktural mendalam (deep structured learning) atau pembelajaran hierarki (hierarchical learning) adalah salah satu cabang dari ilmu machine learning yang terdiri algoritme pemodelan abstraksi tingkat tinggi pada data menggunakan sekumpulan fungsi transformasi non-linear yang ditata berlapis-lapis dan mendalam.
Convolutional Neural Network (CNN)
Convolutional Neural Network (CNN) adalah salah satu jenis neural network yang biasa digunakan pada data image. CNN bisa digunakan untuk mendeteksi dan mengenali object pada sebuah image.
Secara garis besar Convolutional Neural Network (CNN) tidak jauh beda dengan neural network biasanya. CNN terdiri dari neuron yang memiliki weight, bias dan activation function. Convolutional layer juga terdiri dari neuron yang tersusun sedemikian rupa sehingga membentuk sebuah filter dengan panjang dan tinggi (pixels).
Langsung saja untuk contoh CNN pada R dengan library keras dan Tensorflow. Langkah pertama yang dilakukan adalah menjalankan package keras dan Tensorflow. Jika belum ada, silahkan install package terlebih dahulu.
> library(keras)
> library(tensorflow)
Kemudian gunakan dataset gambar digit tulisan tangan MNIST. Dataset tersebut sudah termasuk dalam instalasi keras / tensorflow dan cukup memuat set data seperti yang dapat dilihat pada perintah berikut.
> mnist <- dataset_mnist()
Selanjutnya mempersiapkan fitur (x) dan variabel respon (y) untuk dataset training dan testing, dan dapat memeriksa struktur x_train dan y_train menggunakan fungsi str ().
> x_train <- mnist$train$x
> y_train <- mnist$train$y
> x_test <- mnist$test$x
> y_test <- mnist$test$y
> str(x_train)
int [1:60000, 1:28, 1:28] 0 0 0 0 0 0 0 0 0 0 ...
> str(y_train)
int [1:60000(1d)] 5 0 4 1 9 2 1 3 1 4 ...
Sekarang dibentuk plot matriks 28x28 yang dipilih sebagai gambar menggunakan fungsi image () R. Pada fungsi image () R, cara menampilkan suatu citra diputar 90 derajat dari representasi matriks. Jadi ada langkah tambahan untuk mengatur ulang matriks tersebut sehingga kita dapat menggunakan fungsi image () untuk menampilkannya dalam orientasi sebenarnya.
> index_image = 22 ## change this index to see different image.
> input_matrix <- x_train[index_image,1:28,1:28]
> output_matrix <- apply(input_matrix, 2, rev)
> output_matrix <- t(output_matrix)
> image(1:28, 1:28, output_matrix, col=gray.colors(256), xlab=paste(‘Image for digit of: ‘, y_train[index_image]), ylab=””)
Pada gambar diatas dapat diperoleh bahwa gambar tersebut merupakan digit 0. Untuk menampilkan matriks 28x28 dari gambar diatas digunakan perintah sebagai berikut.
> input_matrix
Selanjutnya akan menunjukkan cara menggunakan Convolutional Neural Network (CNN) untuk kumpulan data tulisan tangan MNIST untuk mengklasifikasikan gambar menjadi beberapa digit. CNN memanfaatkan keterkaitan antar piksel tetangga dalam gambar 2D untuk kinerja yang lebih baik. Ini juga menghindari menghasilkan ribuan atau jutaan fitur untuk gambar resolusi tinggi dengan warna penuh.
Dengan menggunakan dataset yang telah diinput sebelumnya, langkah pertama yang dilakukan adalah mendefinisikan parameter yang akan digunakan pada model CNN. Kemudian input dimensi gambar yang akan digunakan yaitu 28x28.
> # Define a few parameters to be used in the CNN model
> batch_size <- 128
> num_classes <- 10
> epochs <- 10> # Input image dimensions
> img_rows <- 28
> img_cols <- 28
Untuk metode CNN pada umumnya input citra MxN berupa array MxNxK 3D dengan K kanal tertentu. Misalnya, gambar MxN skala abu-abu hanya memiliki satu channel, dan inputnya adalah tensor MxNx1. Gambar RGB MXN 8-bit per channel memiliki tiga channel dengan larik 3 MxN dengan nilai antara 0 dan 255, sehingga inputnya adalah tensor MxNx3. Untuk masalah pada dataset yang digunakan adalah gambarnya abu-abu, namun diperlukan pendefinisian secara spesifik ada satu saluran dengan membentuk kembali array 2D menjadi tensor 3D menggunakan array_reshape (). Variabel input_shape akan digunakan dalam model CNN nanti. Untuk gambar berwarna RGB, jumlah channels adalah 3 dan kita perlu mengganti “1” dengan “3” untuk sel kode di bawah ini jika input gambar berformat RGB. Berikut adalah perintah yang digunakan untuk menambah channel ke dalam dimensi.
> x_train <- array_reshape(x_train, c(nrow(x_train), img_rows, img_cols, 1))
> x_test <- array_reshape(x_test, c(nrow(x_test), img_rows, img_cols, 1))
> input_shape <- c(img_rows, img_cols, 1)
Berikut adalah struktur dari reshaped image, dimensi pertama adalah indeks gambar, dimensi 2–4 merupakan tensor 3D walaupun hanya terdapat satu channel.
> str(x_train)
num [1:60000, 1:28, 1:28, 1] 0 0 0 0 0 0 0 0 0 0 ...
Kemudian skalakan nilai input menjadi antara 0 dan 1 untuk pertimbangan stabilitas numerik yang sama dalam proses pengoptimalan.
> x_train <- x_train / 255
> x_test <- x_test / 255
Lalu ubah variabel respon menjadi kategorikal.
> y_train <- to_categorical(y_train, num_classes)
> y_test <- to_categorical(y_test, num_classes)
Sekarang dilakukan pendefinisian model CNN dengan dua lapisan konvolusional 2D dengan penggabungan maksimal, dan lapisan ke-2 dengan pelepasan tambahan untuk mencegah terjadinya overfitting. Kemudian ratakan output dan gunakan dua layer padat untuk menghubungkan ke kategori gambar.
> # define model structure
> cnn_model <- keras_model_sequential() %>%
layer_conv_2d(filters = 32, kernel_size = c(3,3), activation =
‘relu’, input_shape = input_shape) %>%
layer_max_pooling_2d(pool_size = c(2, 2)) %>%
layer_conv_2d(filters = 64, kernel_size = c(3,3), activation =
‘relu’) %>%
layer_max_pooling_2d(pool_size = c(2, 2)) %>%
layer_dropout(rate = 0.25) %>%
layer_flatten() %>%
layer_dense(units = 128, activation = ‘relu’) %>%
layer_dropout(rate = 0.5) %>%
layer_dense(units = num_classes, activation = ‘softmax’)
Diperoleh model CNN sebagai berikut.
Selanjutnya dilakukan compile model yang telah ditetukan.
> cnn_model %>% compile(
loss = loss_categorical_crossentropy,
optimizer = optimizer_adadelta(),
metrics = c(‘accuracy’))
Kemudian dilakukan training model dengan data yang telah diproses. Sejarah epochs dapat disimpan untuk melacak kemajuan.
> cnn_history <- cnn_model %>% fit(
x_train, y_train,
batch_size = batch_size,
epochs = epochs,
validation_split = 0.2)
Plot dari model CNN yang terbentuk adalah sebagai berikut.
> plot(cnn_history)
Lalu dilakukan evaluasi untuk akurasi model yang terlatih pada dataset pengujian yang cukup baik.
> cnn_model %>% evaluate(x_test, y_test)
Diperoleh akurasi dari model CNN sederhana yang terbentuk adalah 0.992 atau 99.2%. Nilai akurasi yang diperoleh cukup tinggi, sehingga dapat dikatakan model bagus untuk digunakan.
Untuk gambar baru apa pun, setelah menjalani pra-pemrosesan yang sama dapat menggunakan model terlatih untuk memprediksi digit mana gambar tersebut. Berikut adalah perintah yang digunakan untuk membentuk model prediksi.
> cnn_pred <- cnn_model %>%
predict_classes(x_test)
> head(cnn_pred, n=50)
[1] 7 2 1 0 4 1 4 9 5 9 0 6 9 0 1 5 9 7 3 4 9 6 6 5 4 0 7 4 0 1 3
1 3 4 7 2 7 1 2 1 1 7 4 2 3 5 1 2 4 4
Selanjutnya akan diperiksa beberapa gambar yang salah diklasifikasikan untuk melihat apakah manusia dapat melakukan pekerjaan yang lebih baik daripada model CNN sederhana ini. Perintah yang digunakan adalah sebagai berikut.
> ## number of mis-classcified images
> sum(cnn_pred != mnist$test$y)> missed_image = mnist$test$x[cnn_pred != mnist$test$y,,]
> missed_digit = mnist$test$y[cnn_pred != mnist$test$y]
> missed_pred = cnn_pred[cnn_pred != mnist$test$y]> index_image = 11 ## change this index to see different image.
> input_matrix <- missed_image[index_image,1:28,1:28]
> output_matrix <- apply(input_matrix, 2, rev)
> output_matrix <- t(output_matrix)
> image(1:28, 1:28, output_matrix, col=gray.colors(256),
xlab=paste(‘Image for digit ‘, missed_digit[index_image], ‘,
wrongly predicted as ‘, missed_pred[index_image]), ylab=””)
Pada gambar diatas dapat dilihat bahwa gambar tersebut merupakan angka 7, namun dapat salah diprediksi sebagai angka 2.
Oke, cukup sekian pembahasan Convolutional Neural Network (CNN) dengan R. Semoga Bermanfaat.