CNN Using RStudio and Tensorflow

AFIFI INDRASARI
6 min readJan 10, 2021

--

Image taken from Google Images

Assalamu’alaikum, Hola Sahabat Data !

Pada kesempatan kali ini saya akan memberikan sedikit contoh mengenai Convolutional Neural Network Using RStudio and Tensorflow. Sebelum lebih lanjut, apa sih Convolutional Neural Network itu ?

Pengertian

Apa itu CNN?

CNN (Convolutional Neural Network) 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 CNN tidak jauh beda dengan neural network biasanya. CNN terdiri dari neuron yang memiliki weight, bias dan activation function.

Bagaimana CNN Bekerja ?

Secara garis besarnya, CNN memanfaatkan proses konvolusi dengan menggerakan sebuah kernel konvolusi (filter) berukuran tertentu ke sebuah gambar, komputer mendapatkan informasi representatif baru dari hasil perkalian bagian gambar tersebut dengan filter yang digunakan.

Langkah-Langkah

Ayo, saatnya kita mengaplikasikannya dengan RStudio dan Tensorflow!

Buka RStudio kemudian install dan aktifkan packages keras, tensorflow, dan EBImage.

install.packages("keras")
library(keras)
install.packages("tensorflow")
install.packages("remotes")
remotes::install_github("rstudio/tensorflow")
install_tensorflow(version = "2.0.0b1", method = "conda", envname = "r-reticulate")
library(tensorflow)
install.packages("BiocManager")
BiocManager::install("EBImage")
library(EBImage)

Setting working directory atau menentukan di folder mana yang akan bekerja dengan perintah setwd. Syntax save_in untuk menyimpan gambar hasil resize yang akan dilakukan.

setwd("E://percobaan/")
save_in = ("E://percobaanhasil/")

Berikut data yang digunakan, data tersebut terdiri dari 6 gambar bunga mawar dan 6 gambar kaktus. Simpan data tersebut di folder percobaan.

Melakukan resize ukuran masing-masing gambar dengan script berikut.

gambar = list.files()
w = 100
h =100
for (i in 1:length(gambar))
{result = tryCatch({
imgname = gambar[i]
img = readImage(imgname)
img_resized = resize(img, w=w, h=h)
path = paste(save_in,imgname,sep=" ")
writeImage(img_resized,path,quality=70)
print(paste("done",i,sep=" "))
},
error = function(e){print(e)}
)}

Jika tampilannya seperti gambar berikut, artinya proses resize yang dilakukan berhasil namun apabila tidak berhasil maka akan ditampilkan bagian error-nya.

Membuka kembali file percobaanhasil dengan script setwd kemudian membuat fungsi gambar-gambar dengan tujuan untuk menyimpan hasil gambar resize di dalam file.

setwd("E://percobaanhasil/")
gambar2 = list.files()
gambar2

Membaca gambar hasil rezise dan melihat strukturnya.

gambar2 = lapply(gambar2, readImage)
str(gambar2)

Dari output berikut dapat diketahui struktur dari ke-12 gambar, diantaranya yaitu ukuran dari ke-12 gambar yang sama yakni 100x100 dan channelnya 3 karena merupakan gambar berwarna.

Menggunakan fungsi train untuk menampilkan gambar urutan ke 1–4 kemudian disambung dengan gambar urutan ke 7–10 sebagai data percobaan. Fungsi test digunakan untuk menampilkan urutan gambar ke 5–6 disambung dengan urutan gambar ke 11–12 sebagai data pengujian.

train = gambar2[c(1:4,7:10)]
test = gambar2[c(5:6,11:12)]

Melihat detail data train untuk gambar urutan ke 5.

train[[5]]

Menampilkan data train urutan ke 5.

display(train[[5]])

Menyimpan data tersebut dalam bentuk csv.

write.csv(train[[5]],"E://percobaan/datatrain.csv")

Menampilkan gambar data training secara terurut dimana terdapat 2 baris dengan 4 gambar pada masing-masing baris.

par(mfrow=c(2,4))
for (i in 1:8) plot(train[[i]])

Melakukan resize pada gambar yang ada di data train dan data testing agar berukuran kecil sehingga dapat mempercepat proses pengenalan gambar. Adapun ukurannya yaitu 32x32 pixels.

for (i in 1:8){train[[i]] = resize(train[[i]],32,32)}
for (i in 1:4){test[[i]] = resize(test[[i]],32,32)}

Melakukan kombinasi pada semua gambar yang ada di data train, lalu mengikatnya ke dalam 1 letak yang sama agar tidak berganti-ganti urutannya serta melihat hasil kombinasi gambar yang telah diikat.

train <- combine(train)
x = tile(train,8)
display(x,title='gambar')

Melakukan kombinasi pada semua gambar yang ada di data testing, lalu mengikatnya ke dalam 1 letak yang sama agar tidak berganti-ganti urutannya serta melihat hasil kombinasi gambar yang telah diikat.

test = combine(test)
y = tile(test,4)
display(y,title='gambar')

Melihat dimensi data Training dan data Testing.

dim(train)
dim(test)

Seperti yang dapat dilihat, dimensi data training dan data testing telah berubah. Dari output tersebut diperoleh informasi bahwa pada data training memiliki 8 gambar dengan ukuran 32x32 serta memiliki 3 channel. Sedangkan pada data testing memiliki 4 gambar dengan ukuran 32x32 serta memiliki 3 channel.

Menyusun data train dan data test yaitu dengan urutan (4,1,2,3) dan lihat dimensi pada train dan test.

train = aperm(train,c(4,1,2,3))
test = aperm(test,c(4,1,2,3))
dim(train)
dim(test)

Membuat data target yang merupakan klasifikasi dari gambar. Dimisalkan 0 yaitu kaktus dan 1 yaitu mawar.

trainy = c(rep(0,4),rep(1,4))
testy = c(rep(0,2),rep(1,2))
trainy
testy

Membuat label dari data target agar sesuai dengan klasifikasi yang digunakan di dalam library keras dan tensorflow yaitu data kategorik.

trainLabels = to_categorical(trainy)
testLabels = to_categorical(testy)
trainLabels
testLabels

Membuat model untuk deep learning menggunakan library keras.

model = keras_model_sequential()
model%>%
layer_conv_2d(filters=32,
kernel_size = c(3,3),
activation = 'relu',
input_shape = c(32,32,3))%>%
layer_conv_2d(filters=32,
kernel_size = c(3,3),
activation = 'relu')%>%
layer_max_pooling_2d(pool_size = c(2,2))%>%
layer_dropout(rate = 0.01)%>%
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.01)%>%
layer_flatten()%>%
layer_dense(units=256, activation = 'relu')%>%
layer_dropout(rate = 0.01)%>%
layer_dense(units=2, activation = 'softmax')%>%
compile(loss='categorical_crossentropy',
optimizer = optimizer_sgd(lr = 0.01,
decay = 1e-06,
momentum = 0.9,
nesterov = T),
metrics = c('accuracy'))
summary(model)

Total parameter yang akan dikerjakan oleh deep learning ini sebanyak 619,234 perhitungan.

Membuat proses perhitungan dari model.

proses = model%>%
fit(train,
trainLabels,
epoch=50,
batch_size=32,
validation_split = 0.2)

Membuat plot dari proses perhitungan.

plot(proses)

Maka didapatkan hasil perhitungan seperti ini. Nilai validation loss semakin menurun, nilai keakuratan semakin tinggi.

Mengevaluasi tingkat keakuratan dan prediksi dari data train.

model%>%evaluate(train,trainLabels)
pred = model%>%predict_classes(train)
pred
table(Predicted=pred, Actual=trainy)
prob = model%>%predict_proba(train)
cbind(prob, Predicted_class=pred, Actual = trainy)

Didapatkan tingkat keakurasiannya yaitu 0,75.

Mengevaluasi tingkat keakuratan dan prediksi dari data test.

model%>%evaluate(test,testLabels)pred = model%>%predict_classes(test)
table(Predicted=pred, Actual = testy)

Didapatkan tingkat keakurasiannya yaitu 0,75.

Sehingga keseluruhan koding menjadi seperti berikut.

install.packages("keras")
library(keras)
install.packages("tensorflow")
install.packages("remotes")
remotes::install_github("rstudio/tensorflow")
install_tensorflow(version = "2.0.0b1", method = "conda", envname = "r-reticulate")
library(tensorflow)
install.packages("BiocManager")
BiocManager::install("EBImage")
library(EBImage)
search()
ls(3)
setwd("E://percobaan/")
save_in = ("E://percobaanhasil/")
gambar = list.files()
w = 100
h =100
for (i in 1:length(gambar))
{result = tryCatch({
imgname = gambar[i]
img = readImage(imgname)
img_resized = resize(img, w=w, h=h)
path = paste(save_in,imgname,sep=" ")
writeImage(img_resized,path,quality=70)
print(paste("done",i,sep=" "))
},
error = function(e){print(e)}
)}
setwd("E://percobaanhasil/")
gambar2 = list.files()
gambar2
gambar2 = lapply(gambar2, readImage)
str(gambar2)
display(gambar2[[3]])
dim(gambar2[[3]])
train = gambar2[c(1:4,7:10)]
test = gambar2[c(5:6,11:12)]
train[[5]]
display(train[[5]])
write.csv(train[[5]],"E://percobaan/datatrain.csv")
display(train[[2]])
par(mfrow=c(2,4))
for (i in 1:8) plot(train[[i]])
for (i in 1:8){train[[i]] = resize(train[[i]],32,32)}
for (i in 1:4){test[[i]] = resize(test[[i]],32,32)}
train <- combine(train)
x = tile(train,8)
display(x,title='gambar')
dim(train)
test = combine(test)
y = tile(test,4)
display(y,title='gambar')
dim(test)
dim(train)
train = aperm(train,c(4,1,2,3))
test = aperm(test,c(4,1,2,3))
dim(train)
dim(test)
trainy = c(rep(0,4),rep(1,4))
testy = c(rep(0,2),rep(1,2))
trainy
testy
trainLabels = to_categorical(trainy)
testLabels = to_categorical(testy)
trainLabels
testLabels
model = keras_model_sequential()
model%>%
layer_conv_2d(filters=32,
kernel_size = c(3,3),
activation = 'relu',
input_shape = c(32,32,3))%>%
layer_conv_2d(filters=32,
kernel_size = c(3,3),
activation = 'relu')%>%
layer_max_pooling_2d(pool_size = c(2,2))%>%
layer_dropout(rate = 0.01)%>%
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.01)%>%
layer_flatten()%>%
layer_dense(units=256, activation = 'relu')%>%
layer_dropout(rate = 0.01)%>%
layer_dense(units=2, activation = 'softmax')%>%
compile(loss='categorical_crossentropy',
optimizer = optimizer_sgd(lr = 0.01,
decay = 1e-06,
momentum = 0.9,
nesterov = T),
metrics = c('accuracy'))
summary(model)
proses = model%>%
fit(train,
trainLabels,
epoch=50,
batch_size=32,
validation_split = 0.2)
plot(proses)
model%>%evaluate(train,trainLabels)
pred = model%>%predict_classes(train)
pred
table(Predicted=pred, Actual=trainy)
prob = model%>%predict_proba(train)
cbind(prob, Predicted_class=pred, Actual = trainy)
model%>%evaluate(test,testLabels)pred = model%>%predict_classes(test)
table(Predicted=pred, Actual = testy)

Sekian untuk materi Convolutional Neural Network (CNN). Semoga bermanfaat, selamat mencoba, dan bereksplorasi lebih jauh 😊

--

--