1 Introduction

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 / atas
  • 1 Celana panjang
  • 2 Pullover
  • 3 Gaun
  • 4 Lapisan
  • 5 Sandal
  • 6 Kemeja
  • 7 Sepatu kets
  • 8 Tas
  • 9 Sepatu bot

Tujuan : Mendapatkan model terbaik menggunakan konsep Neural Network dalam memprediksi gambar objek fashion menggunakan keras

2 Persiapan Data

2.1 Read Data

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.

2.2 Memisahkan Prediktor dan target, Mengubah Data ke Dalam Matriks, dan Features Scaling

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

2.3 Mengubah Matriks Menjadi Array

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)

3 Membuat Model Neural Network

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")

3.1 Membangun Arsitektur Model

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
## ________________________________________________________________________________

3.2 Fitting Model

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)

4 Prediksi

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()

5 Evaluasi Model Neural Network

5.1 Confusion Matrix

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

6 Kesimpulan

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…