Fashion-MNIST adalah kumpulan data gambar seputar
objek fashion, dimana terdapat 60 ribu observasi di
data_train dan 10 ribu observasi di data_test
yang telah tersedia pada Kaggle.
Di dalamnya juga terdapat 10 label yang mewakili setiap objek dari
gambar fashion yang ada. Dengan rincian label sebagai berikut:
0 T-shirt / atas1 Celana panjang2 Pullover3 Gaun4 Lapisan5 Sandal6 Kemeja7 Sepatu kets8 Tas9 Sepatu botTujuan : Mendapatkan model terbaik menggunakan konsep Neural Network dalam memprediksi gambar objek fashion menggunakan keras
Pertama tentunya kami perlu membaca dan memerikasa data
fashion-mnist-train.csv dan
fashion-mnist-test.csv, kemudian simpan data tersebut
kedalam objek fashion_train dan
fashion_test.
# your code here
fashion_train <- read.csv("fashion-mnist_train.csv")
fashion_test <- read.csv("fashion-mnist_test.csv")
Kemudian periksa data fashion_train dengan menggunakan
head().
head(fashion_train)
Terlihat bahwa fashion_train terdiri dari 10000
observasi dan 785 variabel (1 target and 784 prediktor). Dimana setiap
prediktor merepresentasikan pixel dari gambar objek.
Data berisi nilai pixel yang disimpan dalam data frame. Namun, kami
harus memisahkan prediktor dan target untuk data
fashion_train dan fashion_test dan
menyimpannya ke dalam train_x, train_y,
test_x, dan test_y. Kami memanfaatkan fungsi
select() untuk memisahkan prediktor dan target pada data
fashion_train dan fashion_test.
Setelah itu, data train_x, train_y,
test_x, dan test_y harus diubah menjadi
matriks terlebih dahulu. Kami mengubah data menjadi format matrix
menggunakan fungsi data.matrix(). Khusus untuk prediktor
variabel yang disimpan pada train_x dan test_x
akan kami lakukan features scaling dengan cara membaginya
dengan 255 sesuai dengan rentang nilai dari pixel.
# Memisahkan prediktor dan target pada data sign_train
train_x <- select(fashion_train, -label) # Memilih semua kolom kecuali kolom 'label'
train_y <- fashion_train$label # Kolom 'label' sebagai target
# Memisahkan prediktor dan target pada data sign_test
test_x <- select(fashion_train, -label) # Memilih semua kolom kecuali kolom 'label'
test_y <- fashion_train$label # Kolom 'label' sebagai target
# Mengubah data menjadi matriks
train_x <- data.matrix(train_x)
train_y <- data.matrix(train_y)
test_x <- data.matrix(test_x)
test_y <- data.matrix(test_y)
# Melakukan feature scaling pada prediktor variabel
train_x <- train_x / 255
test_x <- test_x / 255
Selanjutnya, kami mengubah matriks prediktor ke dalam bentuk array.
Dengan menggunakan fungsi array_reshape(data, dim(data))
untuk mengubah matriks prediktor menjadi array.
# Predictor variables in `train_x`
train_x_array <- array_reshape(train_x, dim(train_x))
# Predictor variables in `test_x`
test_x_array <- array_reshape(test_x, dim(test_x))
Kami juga akan melakukan one-hot encoding terhadap target
variabel pada data train (train_y). Anda dapat menggunakan
fungsi to_categorical() dari library Keras,
kemudian menyimpannya kedalam objek train_y_dummy.
# Target variable in `train_y`
train_y_dummy <- to_categorical(train_y)
Untuk mengatur layer, pertama kami perlu membuat model dasar, yaitu
model sequential. Panggil fungsi keras_model_sequential(),
dan gunakan operator pipe untuk membangun arsitektur model dari
model dasar yang ada.
Untuk membangun arsitektur tiap layer, kami akan membuat beberapa model dengan mengatur beberapa parameter.
Pertama, buat model (simpan dalam model_base) dengan
mendefinisikan parameter-parameter di bawah ini: - layer pertama berisi
128 nodes, fungsi aktivasi relu, 784 input shape - layer kedua berisi 64
nodes, fungsi aktivasi relu - layer ketiga berisi 10 nodes, fungsi
aktivasi softmax
Sebelum membangun arsitekturnya, kami harus mengatur dahulu
randomness bobot yang akan digunakan pada epoch pertama menggunakan
set_random_seed() dari tensorflow.
# your code here
tensorflow::set_random_seed(24)
model_base <- keras_model_sequential() %>%
layer_dense(units = 128, activation = "relu", input_shape = c(784)) %>%
layer_dense(units = 64, activation = "relu") %>%
layer_dense(units = 10, activation = "softmax")
Model kedua yang akan kami buat disimpan ke dalam
model_bigger dengan mendefinisikan parameter di bawah ini:
- layer pertama berisi 256 node, fungsi aktivasi relu, 784 input shape -
layer kedua berisi 128 node, fungsi aktivasi relu - layer ketiga berisi
64 node, fungsi aktivasi relu - layer keempat berisi 10 node, fungsi
aktivasi softmax
# your code here
tensorflow::set_random_seed(24)
model_bigger <- keras_model_sequential() %>%
layer_dense(units = 256, activation = "relu", input_shape = c(784)) %>%
layer_dense(units = 128, activation = "relu") %>%
layer_dense(units = 64, activation = "relu") %>%
layer_dense(units = 10, activation = "softmax")
Kami masih perlu melakukan beberapa pengaturan sebelum melatih
model_base danmodel_bigger. Kita harus
menyusun model dengan menentukan loss function, jenis
optimizer, dan metrik evaluasi. Anda dapat melakukan
compile model terhadap model_base dan
model_bigger dengan menggunakan parameter berikut: -
categorical_crossentropy sebagai loss function -
optimizer_sgd - accuracy sebagai metrik evaluasi
# model base
model_base %>% compile(loss = "categorical_crossentropy",
optimizer = optimizer_sgd(), metrics = c("accuracy"))
# model bigger
model_bigger %>% compile(loss = "categorical_crossentropy",
optimizer = optimizer_sgd(), metrics = c("accuracy"))
summary(model_base)
## Model: "sequential"
## ________________________________________________________________________________
## Layer (type) Output Shape Param #
## ================================================================================
## dense_2 (Dense) (None, 128) 100480
## dense_1 (Dense) (None, 64) 8256
## dense (Dense) (None, 10) 650
## ================================================================================
## Total params: 109,386
## Trainable params: 109,386
## Non-trainable params: 0
## ________________________________________________________________________________
Pada tahap ini, kita fit model menggunakan epoch = 10,
batch_size = 150, dan menambahkan parameter
shuffle = F agar sampel pada tiap batch tidak diambil
secara random melainkan terurut (sequence) untuk
model_base dan model_bigger. Silahkan simpan
hasil fit model ke dalam history_base dan
history_bigger. Kemudian kami akan menampilkan visualisasi
dari hasil yang didapatkan menggunakan fungsi plot().
# model base
history_base <- model_base %>% fit(
train_x, train_y_dummy,
epochs = 10,
batch_size = 150,
shuffle = FALSE,
validation_data = list(test_x, train_y_dummy),
verbose = 1
)
plot(history_base)
history_bigger <- model_bigger %>% fit(
train_x, train_y_dummy,
epochs = 10,
batch_size = 150,
shuffle = FALSE,
validation_data = list(test_x, train_y_dummy),
verbose = 1
)
plot(history_bigger)
Untuk mengevaluasi performa model terhadap data yang belum dilihat,
kami akan memprediksi data test (test_x_array) menggunakan
model yang sudah dilatih. Untuk prediksi kami akan menggunakan fungsi
predict() dan menyimpanya kedalam variabel
pred_base dan pred_bigger.
# your code here
pred_base <- predict(object = model_base, x = test_x_array) %>% k_argmax() %>% as.array() %>% as.factor()
pred_bigger <- predict(object = model_bigger, x = test_x_array) %>% k_argmax() %>% as.array() %>% as.factor()
Kami menggunakan confusion matrix untuk mengevaluasi model
menggunakan confusionMatrix() dari package
caret. Jangan lupa untuk melakukan explicit
coercion as.factor bila data kami belum dalam bentuk
faktor.
# Mengonversi prediksi dan label asli ke faktor
test_y_factor <- test_y %>% as.factor()
# Membuat confusion matrix
confusion_matrixbase <- confusionMatrix(pred_base, test_y_factor)
confusion_matrixbigger <- confusionMatrix(pred_bigger, test_y_factor)
# Menampilkan confusion matrix
confusion_matrixbase
## Confusion Matrix and Statistics
##
## Reference
## Prediction 0 1 2 3 4 5 6 7 8 9
## 0 4695 8 47 150 8 1 711 0 8 1
## 1 39 5727 18 76 10 1 22 0 7 1
## 2 116 53 4703 74 658 0 836 0 45 1
## 3 475 177 82 5341 290 5 291 0 62 0
## 4 21 13 718 193 4561 0 607 0 20 0
## 5 11 0 5 1 2 5546 1 219 35 88
## 6 547 17 335 129 410 0 3359 0 85 1
## 7 0 0 0 0 0 285 0 5477 27 245
## 8 95 5 92 36 61 34 172 11 5704 5
## 9 1 0 0 0 0 128 1 293 7 5658
##
## Overall Statistics
##
## Accuracy : 0.8462
## 95% CI : (0.8433, 0.8491)
## No Information Rate : 0.1
## P-Value [Acc > NIR] : < 2.2e-16
##
## Kappa : 0.8291
##
## Mcnemar's Test P-Value : NA
##
## Statistics by Class:
##
## Class: 0 Class: 1 Class: 2 Class: 3 Class: 4 Class: 5
## Sensitivity 0.78250 0.95450 0.78383 0.89017 0.76017 0.92433
## Specificity 0.98270 0.99678 0.96698 0.97441 0.97089 0.99330
## Pos Pred Value 0.83407 0.97051 0.72510 0.79444 0.74368 0.93873
## Neg Pred Value 0.97600 0.99495 0.97576 0.98763 0.97329 0.99161
## Prevalence 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000
## Detection Rate 0.07825 0.09545 0.07838 0.08902 0.07602 0.09243
## Detection Prevalence 0.09382 0.09835 0.10810 0.11205 0.10222 0.09847
## Balanced Accuracy 0.88260 0.97564 0.87541 0.93229 0.86553 0.95881
## Class: 6 Class: 7 Class: 8 Class: 9
## Sensitivity 0.55983 0.91283 0.95067 0.9430
## Specificity 0.97178 0.98969 0.99054 0.9920
## Pos Pred Value 0.68790 0.90769 0.91778 0.9294
## Neg Pred Value 0.95208 0.99031 0.99450 0.9937
## Prevalence 0.10000 0.10000 0.10000 0.1000
## Detection Rate 0.05598 0.09128 0.09507 0.0943
## Detection Prevalence 0.08138 0.10057 0.10358 0.1015
## Balanced Accuracy 0.76581 0.95126 0.97060 0.9675
confusion_matrixbigger
## Confusion Matrix and Statistics
##
## Reference
## Prediction 0 1 2 3 4 5 6 7 8 9
## 0 4917 12 69 153 5 2 867 0 13 2
## 1 32 5771 17 72 5 0 14 0 6 2
## 2 137 32 4866 71 675 1 907 0 58 0
## 3 428 147 79 5377 245 4 272 0 53 3
## 4 17 20 648 192 4687 0 645 0 17 0
## 5 11 0 6 2 3 5671 2 192 31 115
## 6 361 12 231 103 327 0 3114 0 51 0
## 7 0 0 0 0 0 212 1 5546 34 257
## 8 96 5 84 30 53 25 177 11 5734 4
## 9 1 1 0 0 0 85 1 251 3 5617
##
## Overall Statistics
##
## Accuracy : 0.855
## 95% CI : (0.8522, 0.8578)
## No Information Rate : 0.1
## P-Value [Acc > NIR] : < 2.2e-16
##
## Kappa : 0.8389
##
## Mcnemar's Test P-Value : NA
##
## Statistics by Class:
##
## Class: 0 Class: 1 Class: 2 Class: 3 Class: 4 Class: 5
## Sensitivity 0.81950 0.96183 0.8110 0.89617 0.78117 0.94517
## Specificity 0.97920 0.99726 0.9652 0.97720 0.97150 0.99330
## Pos Pred Value 0.81407 0.97500 0.7212 0.81371 0.75281 0.94000
## Neg Pred Value 0.97993 0.99577 0.9787 0.98833 0.97558 0.99390
## Prevalence 0.10000 0.10000 0.1000 0.10000 0.10000 0.10000
## Detection Rate 0.08195 0.09618 0.0811 0.08962 0.07812 0.09452
## Detection Prevalence 0.10067 0.09865 0.1124 0.11013 0.10377 0.10055
## Balanced Accuracy 0.89935 0.97955 0.8881 0.93669 0.87633 0.96923
## Class: 6 Class: 7 Class: 8 Class: 9
## Sensitivity 0.51900 0.92433 0.95567 0.93617
## Specificity 0.97991 0.99067 0.99102 0.99367
## Pos Pred Value 0.74161 0.91669 0.92201 0.94261
## Neg Pred Value 0.94828 0.99158 0.99505 0.99291
## Prevalence 0.10000 0.10000 0.10000 0.10000
## Detection Rate 0.05190 0.09243 0.09557 0.09362
## Detection Prevalence 0.06998 0.10083 0.10365 0.09932
## Balanced Accuracy 0.74945 0.95750 0.97334 0.96492
Berdasarkan kedua model yang telah dibuat didapatkan hasil bahwa
kedua model tersebut memiliki nilai akurasi yang cukup baik dimana
keduanya berhasil melebih 70% untuk nilai akurasi model yang di dapat.
Dengan rincian model_base memiliki akurasi sebesar 84.6%
dan model_bigger dengan akurasi 85.5%. Terlihat bahwa
model_bigger memiliki nilai akurasi tertinggi dan selisih
akurasi antara data train dan data test juga terlihat paling kecil dari
model_base. Oleh karena itu model_bigger
menjadi pilihan terbaik untuk digunakan dalam memprediksi gambar objek
fashion nantinya. Terimakasih semoga bermanfaat…