library(tensorflow)
library(keras)
library(ggplot2)
#load mnist fashion data
fashionMnist <- dataset_fashion_mnist()
# create a 60,000x28x28 tensor for the training images
train_images <- fashionMnist$train$x
# create a 60,000-element vector for the training labels
train_labels <- fashionMnist$train$y
# create a 10,000x28x28 tensor for the test images
test_images <- fashionMnist$test$x
# create a 10,000-element vector for the test labels
test_labels <- fashionMnist$test$y
# select the 400th training image
test <- train_images[400,,]
# plot it!
plot(as.raster(test, max = 300))
# Defining the model
model1 <- keras_model_sequential() %>%
layer_dense(units = 1024, activation = "relu", input_shape = c(28 * 28)) %>%
layer_dense(units = 512, activation = "sigmoid", input_shape = c(28 * 28)) %>%
layer_dense(units = 10, activation = "softmax")
model1 %>% compile(
optimizer = optimizer_adam(),
loss = "mean_squared_error",
metrics = c("accuracy")
)
# Reshape and normalize images
train_images <- array_reshape(train_images, c(60000, 28 * 28)) / 255
test_images <- array_reshape(test_images, c(10000, 28 * 28)) / 255
#Checking dimeansion of train and test images
dim(train_images)
## [1] 60000 784
dim(test_images)
## [1] 10000 784
# One-hot encoding of labels
train_labels <- to_categorical(train_labels)
test_labels <- to_categorical(test_labels)
# Defining class labels
class_labels <- c('T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat',
'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot')
# Fitting the model
Fit1 <- model1 %>% fit(
train_images, train_labels,
epochs = 25, batch_size = 800,
validation_split = 0.1
)
## Epoch 1/25
## 68/68 - 3s - loss: 0.0341 - accuracy: 0.7565 - val_loss: 0.0241 - val_accuracy: 0.8290 - 3s/epoch - 45ms/step
## Epoch 2/25
## 68/68 - 2s - loss: 0.0216 - accuracy: 0.8506 - val_loss: 0.0214 - val_accuracy: 0.8545 - 2s/epoch - 29ms/step
## Epoch 3/25
## 68/68 - 2s - loss: 0.0196 - accuracy: 0.8659 - val_loss: 0.0194 - val_accuracy: 0.8648 - 2s/epoch - 29ms/step
## Epoch 4/25
## 68/68 - 2s - loss: 0.0179 - accuracy: 0.8785 - val_loss: 0.0192 - val_accuracy: 0.8658 - 2s/epoch - 31ms/step
## Epoch 5/25
## 68/68 - 2s - loss: 0.0172 - accuracy: 0.8834 - val_loss: 0.0208 - val_accuracy: 0.8518 - 2s/epoch - 30ms/step
## Epoch 6/25
## 68/68 - 2s - loss: 0.0160 - accuracy: 0.8913 - val_loss: 0.0172 - val_accuracy: 0.8805 - 2s/epoch - 28ms/step
## Epoch 7/25
## 68/68 - 2s - loss: 0.0156 - accuracy: 0.8928 - val_loss: 0.0169 - val_accuracy: 0.8850 - 2s/epoch - 28ms/step
## Epoch 8/25
## 68/68 - 2s - loss: 0.0147 - accuracy: 0.9002 - val_loss: 0.0168 - val_accuracy: 0.8818 - 2s/epoch - 28ms/step
## Epoch 9/25
## 68/68 - 2s - loss: 0.0141 - accuracy: 0.9058 - val_loss: 0.0171 - val_accuracy: 0.8817 - 2s/epoch - 29ms/step
## Epoch 10/25
## 68/68 - 2s - loss: 0.0138 - accuracy: 0.9069 - val_loss: 0.0173 - val_accuracy: 0.8813 - 2s/epoch - 30ms/step
## Epoch 11/25
## 68/68 - 2s - loss: 0.0132 - accuracy: 0.9117 - val_loss: 0.0160 - val_accuracy: 0.8888 - 2s/epoch - 27ms/step
## Epoch 12/25
## 68/68 - 2s - loss: 0.0128 - accuracy: 0.9148 - val_loss: 0.0159 - val_accuracy: 0.8898 - 2s/epoch - 27ms/step
## Epoch 13/25
## 68/68 - 2s - loss: 0.0124 - accuracy: 0.9186 - val_loss: 0.0155 - val_accuracy: 0.8928 - 2s/epoch - 28ms/step
## Epoch 14/25
## 68/68 - 2s - loss: 0.0121 - accuracy: 0.9204 - val_loss: 0.0156 - val_accuracy: 0.8918 - 2s/epoch - 28ms/step
## Epoch 15/25
## 68/68 - 2s - loss: 0.0116 - accuracy: 0.9238 - val_loss: 0.0159 - val_accuracy: 0.8912 - 2s/epoch - 28ms/step
## Epoch 16/25
## 68/68 - 2s - loss: 0.0114 - accuracy: 0.9247 - val_loss: 0.0161 - val_accuracy: 0.8927 - 2s/epoch - 29ms/step
## Epoch 17/25
## 68/68 - 2s - loss: 0.0110 - accuracy: 0.9277 - val_loss: 0.0176 - val_accuracy: 0.8803 - 2s/epoch - 29ms/step
## Epoch 18/25
## 68/68 - 2s - loss: 0.0111 - accuracy: 0.9271 - val_loss: 0.0153 - val_accuracy: 0.8942 - 2s/epoch - 28ms/step
## Epoch 19/25
## 68/68 - 2s - loss: 0.0108 - accuracy: 0.9284 - val_loss: 0.0154 - val_accuracy: 0.8952 - 2s/epoch - 28ms/step
## Epoch 20/25
## 68/68 - 2s - loss: 0.0102 - accuracy: 0.9338 - val_loss: 0.0150 - val_accuracy: 0.8958 - 2s/epoch - 28ms/step
## Epoch 21/25
## 68/68 - 2s - loss: 0.0096 - accuracy: 0.9383 - val_loss: 0.0152 - val_accuracy: 0.8947 - 2s/epoch - 28ms/step
## Epoch 22/25
## 68/68 - 2s - loss: 0.0098 - accuracy: 0.9370 - val_loss: 0.0157 - val_accuracy: 0.8918 - 2s/epoch - 29ms/step
## Epoch 23/25
## 68/68 - 2s - loss: 0.0095 - accuracy: 0.9394 - val_loss: 0.0159 - val_accuracy: 0.8923 - 2s/epoch - 27ms/step
## Epoch 24/25
## 68/68 - 2s - loss: 0.0092 - accuracy: 0.9406 - val_loss: 0.0153 - val_accuracy: 0.8952 - 2s/epoch - 29ms/step
## Epoch 25/25
## 68/68 - 2s - loss: 0.0087 - accuracy: 0.9448 - val_loss: 0.0153 - val_accuracy: 0.8958 - 2s/epoch - 28ms/step
# Testing the model accuracy
evaluation1 <- model1 %>% evaluate(test_images, test_labels)
## 313/313 - 1s - loss: 0.0161 - accuracy: 0.8918 - 779ms/epoch - 2ms/step
cat("Model 1 Accuracy:", evaluation1[2], "\n")
## Model 1 Accuracy: 0.8918
# Plotting the model output
plot(Fit1)+theme_bw()
#Defining the model
model2 <- keras_model_sequential() %>%
layer_dense(units = 512, activation = "relu", input_shape = c(28 * 28)) %>%
layer_dropout(rate = 0.5) %>%
layer_dense(units = 512, activation = "tanh") %>%
layer_dropout(rate = 0.2) %>%
layer_dense(units = 10, activation = "softmax")
model2 %>% compile(
optimizer = "rmsprop",
loss = "categorical_crossentropy",
metrics = c("accuracy")
)
#Training the model
fit2 <- model2 %>% fit(
train_images, train_labels,
epochs = 22, batch_size = 1200,
validation_split = 0.3
)
## Epoch 1/22
## 35/35 - 2s - loss: 1.0369 - accuracy: 0.6432 - val_loss: 0.7352 - val_accuracy: 0.7208 - 2s/epoch - 46ms/step
## Epoch 2/22
## 35/35 - 1s - loss: 0.6415 - accuracy: 0.7626 - val_loss: 0.5233 - val_accuracy: 0.8044 - 1s/epoch - 30ms/step
## Epoch 3/22
## 35/35 - 1s - loss: 0.5628 - accuracy: 0.7939 - val_loss: 0.4720 - val_accuracy: 0.8250 - 971ms/epoch - 28ms/step
## Epoch 4/22
## 35/35 - 1s - loss: 0.5093 - accuracy: 0.8093 - val_loss: 0.4300 - val_accuracy: 0.8411 - 1s/epoch - 29ms/step
## Epoch 5/22
## 35/35 - 1s - loss: 0.4801 - accuracy: 0.8245 - val_loss: 0.4718 - val_accuracy: 0.8109 - 981ms/epoch - 28ms/step
## Epoch 6/22
## 35/35 - 1s - loss: 0.4545 - accuracy: 0.8331 - val_loss: 0.4070 - val_accuracy: 0.8468 - 942ms/epoch - 27ms/step
## Epoch 7/22
## 35/35 - 1s - loss: 0.4336 - accuracy: 0.8397 - val_loss: 0.4344 - val_accuracy: 0.8377 - 927ms/epoch - 26ms/step
## Epoch 8/22
## 35/35 - 1s - loss: 0.4193 - accuracy: 0.8454 - val_loss: 0.4703 - val_accuracy: 0.8381 - 936ms/epoch - 27ms/step
## Epoch 9/22
## 35/35 - 1s - loss: 0.4065 - accuracy: 0.8499 - val_loss: 0.3894 - val_accuracy: 0.8534 - 926ms/epoch - 26ms/step
## Epoch 10/22
## 35/35 - 1s - loss: 0.3971 - accuracy: 0.8528 - val_loss: 0.3761 - val_accuracy: 0.8607 - 949ms/epoch - 27ms/step
## Epoch 11/22
## 35/35 - 1s - loss: 0.3772 - accuracy: 0.8591 - val_loss: 0.3609 - val_accuracy: 0.8663 - 1s/epoch - 29ms/step
## Epoch 12/22
## 35/35 - 1s - loss: 0.3737 - accuracy: 0.8612 - val_loss: 0.4132 - val_accuracy: 0.8511 - 1s/epoch - 29ms/step
## Epoch 13/22
## 35/35 - 1s - loss: 0.3631 - accuracy: 0.8644 - val_loss: 0.3879 - val_accuracy: 0.8606 - 919ms/epoch - 26ms/step
## Epoch 14/22
## 35/35 - 1s - loss: 0.3613 - accuracy: 0.8650 - val_loss: 0.3933 - val_accuracy: 0.8534 - 1s/epoch - 30ms/step
## Epoch 15/22
## 35/35 - 1s - loss: 0.3484 - accuracy: 0.8698 - val_loss: 0.3593 - val_accuracy: 0.8708 - 1s/epoch - 30ms/step
## Epoch 16/22
## 35/35 - 1s - loss: 0.3442 - accuracy: 0.8709 - val_loss: 0.3683 - val_accuracy: 0.8603 - 930ms/epoch - 27ms/step
## Epoch 17/22
## 35/35 - 1s - loss: 0.3345 - accuracy: 0.8747 - val_loss: 0.4152 - val_accuracy: 0.8407 - 937ms/epoch - 27ms/step
## Epoch 18/22
## 35/35 - 1s - loss: 0.3377 - accuracy: 0.8735 - val_loss: 0.3489 - val_accuracy: 0.8755 - 1s/epoch - 29ms/step
## Epoch 19/22
## 35/35 - 1s - loss: 0.3235 - accuracy: 0.8773 - val_loss: 0.3632 - val_accuracy: 0.8633 - 931ms/epoch - 27ms/step
## Epoch 20/22
## 35/35 - 1s - loss: 0.3208 - accuracy: 0.8806 - val_loss: 0.3513 - val_accuracy: 0.8714 - 1s/epoch - 29ms/step
## Epoch 21/22
## 35/35 - 1s - loss: 0.3110 - accuracy: 0.8828 - val_loss: 0.3266 - val_accuracy: 0.8806 - 996ms/epoch - 28ms/step
## Epoch 22/22
## 35/35 - 1s - loss: 0.3160 - accuracy: 0.8810 - val_loss: 0.3326 - val_accuracy: 0.8808 - 956ms/epoch - 27ms/step
# Testing the model performance
evaluation2 <- model2 %>% evaluate(test_images, test_labels)
## 313/313 - 1s - loss: 0.3656 - accuracy: 0.8699 - 604ms/epoch - 2ms/step
cat("Model 2 Accuracy:", evaluation2[2], "\n")
## Model 2 Accuracy: 0.8699
#Plotting the model result
plot(fit2)+theme_bw()
# Declaring the model
model3 <- keras_model_sequential() %>%
layer_dense(units = 1024, activation = "relu", input_shape = c(28 * 28)) %>%
layer_dense(units = 512, activation = "relu") %>%
layer_dense(units = 128, activation = "relu") %>%
layer_dense(units = 10, activation = "softmax")
model3 %>% compile(
optimizer = optimizer_rmsprop(),
loss = "binary_crossentropy",
metrics = c("accuracy")
)
#Training the model
fit3 <- model3 %>% fit(
train_images, train_labels,
epochs = 30, batch_size = 1200,
validation_split = 0.2
)
## Epoch 1/30
## 40/40 - 2s - loss: 0.2172 - accuracy: 0.5691 - val_loss: 0.1404 - val_accuracy: 0.7042 - 2s/epoch - 49ms/step
## Epoch 2/30
## 40/40 - 1s - loss: 0.1262 - accuracy: 0.7353 - val_loss: 0.1129 - val_accuracy: 0.7678 - 1s/epoch - 30ms/step
## Epoch 3/30
## 40/40 - 1s - loss: 0.1071 - accuracy: 0.7744 - val_loss: 0.1008 - val_accuracy: 0.7785 - 1s/epoch - 30ms/step
## Epoch 4/30
## 40/40 - 1s - loss: 0.0960 - accuracy: 0.8010 - val_loss: 0.0849 - val_accuracy: 0.8319 - 1s/epoch - 30ms/step
## Epoch 5/30
## 40/40 - 1s - loss: 0.0894 - accuracy: 0.8162 - val_loss: 0.0838 - val_accuracy: 0.8289 - 1s/epoch - 32ms/step
## Epoch 6/30
## 40/40 - 1s - loss: 0.0838 - accuracy: 0.8303 - val_loss: 0.0843 - val_accuracy: 0.8260 - 1s/epoch - 32ms/step
## Epoch 7/30
## 40/40 - 1s - loss: 0.0799 - accuracy: 0.8347 - val_loss: 0.0818 - val_accuracy: 0.8382 - 1s/epoch - 30ms/step
## Epoch 8/30
## 40/40 - 1s - loss: 0.0775 - accuracy: 0.8404 - val_loss: 0.0736 - val_accuracy: 0.8517 - 1s/epoch - 31ms/step
## Epoch 9/30
## 40/40 - 1s - loss: 0.0740 - accuracy: 0.8471 - val_loss: 0.0766 - val_accuracy: 0.8390 - 1s/epoch - 31ms/step
## Epoch 10/30
## 40/40 - 1s - loss: 0.0719 - accuracy: 0.8518 - val_loss: 0.0700 - val_accuracy: 0.8572 - 1s/epoch - 34ms/step
## Epoch 11/30
## 40/40 - 1s - loss: 0.0700 - accuracy: 0.8564 - val_loss: 0.0750 - val_accuracy: 0.8450 - 1s/epoch - 31ms/step
## Epoch 12/30
## 40/40 - 1s - loss: 0.0676 - accuracy: 0.8620 - val_loss: 0.0689 - val_accuracy: 0.8611 - 1s/epoch - 32ms/step
## Epoch 13/30
## 40/40 - 1s - loss: 0.0667 - accuracy: 0.8627 - val_loss: 0.0694 - val_accuracy: 0.8581 - 1s/epoch - 29ms/step
## Epoch 14/30
## 40/40 - 1s - loss: 0.0659 - accuracy: 0.8636 - val_loss: 0.0650 - val_accuracy: 0.8692 - 1s/epoch - 31ms/step
## Epoch 15/30
## 40/40 - 1s - loss: 0.0641 - accuracy: 0.8690 - val_loss: 0.0765 - val_accuracy: 0.8440 - 1s/epoch - 32ms/step
## Epoch 16/30
## 40/40 - 1s - loss: 0.0623 - accuracy: 0.8738 - val_loss: 0.0696 - val_accuracy: 0.8579 - 1s/epoch - 30ms/step
## Epoch 17/30
## 40/40 - 1s - loss: 0.0617 - accuracy: 0.8732 - val_loss: 0.0665 - val_accuracy: 0.8618 - 1s/epoch - 31ms/step
## Epoch 18/30
## 40/40 - 1s - loss: 0.0606 - accuracy: 0.8759 - val_loss: 0.0688 - val_accuracy: 0.8620 - 1s/epoch - 31ms/step
## Epoch 19/30
## 40/40 - 1s - loss: 0.0595 - accuracy: 0.8786 - val_loss: 0.0661 - val_accuracy: 0.8666 - 1s/epoch - 33ms/step
## Epoch 20/30
## 40/40 - 1s - loss: 0.0586 - accuracy: 0.8798 - val_loss: 0.0630 - val_accuracy: 0.8714 - 1s/epoch - 32ms/step
## Epoch 21/30
## 40/40 - 1s - loss: 0.0569 - accuracy: 0.8840 - val_loss: 0.0599 - val_accuracy: 0.8779 - 1s/epoch - 31ms/step
## Epoch 22/30
## 40/40 - 1s - loss: 0.0576 - accuracy: 0.8837 - val_loss: 0.0617 - val_accuracy: 0.8782 - 1s/epoch - 32ms/step
## Epoch 23/30
## 40/40 - 1s - loss: 0.0554 - accuracy: 0.8864 - val_loss: 0.0627 - val_accuracy: 0.8721 - 1s/epoch - 32ms/step
## Epoch 24/30
## 40/40 - 1s - loss: 0.0555 - accuracy: 0.8858 - val_loss: 0.0592 - val_accuracy: 0.8782 - 1s/epoch - 32ms/step
## Epoch 25/30
## 40/40 - 1s - loss: 0.0541 - accuracy: 0.8905 - val_loss: 0.0647 - val_accuracy: 0.8651 - 1s/epoch - 30ms/step
## Epoch 26/30
## 40/40 - 1s - loss: 0.0532 - accuracy: 0.8913 - val_loss: 0.0591 - val_accuracy: 0.8806 - 1s/epoch - 32ms/step
## Epoch 27/30
## 40/40 - 1s - loss: 0.0538 - accuracy: 0.8905 - val_loss: 0.0573 - val_accuracy: 0.8823 - 1s/epoch - 32ms/step
## Epoch 28/30
## 40/40 - 1s - loss: 0.0516 - accuracy: 0.8953 - val_loss: 0.0578 - val_accuracy: 0.8846 - 1s/epoch - 33ms/step
## Epoch 29/30
## 40/40 - 1s - loss: 0.0512 - accuracy: 0.8955 - val_loss: 0.0593 - val_accuracy: 0.8798 - 1s/epoch - 33ms/step
## Epoch 30/30
## 40/40 - 1s - loss: 0.0499 - accuracy: 0.8999 - val_loss: 0.0598 - val_accuracy: 0.8802 - 1s/epoch - 31ms/step
#Testing the model
evaluation3 <- model3 %>% evaluate(test_images, test_labels)
## 313/313 - 1s - loss: 0.0638 - accuracy: 0.8727 - 1s/epoch - 3ms/step
cat("Model 3 Accuracy:", evaluation3[2], "\n")
## Model 3 Accuracy: 0.8727
# Plotting the model result
plot(fit3)+theme_bw()
Based on the accuracy measurement of three models, the model 1 using
Optimizer adam and MSE loss function seems to be most accurate.