library(tensorflow)
library(keras)
library(ggplot2)
#Loading the Data set
mnist <- dataset_fashion_mnist()
#Creating tensors for the training images
train_images <- mnist$train$x
train_labels <- mnist$train$y
# Craeting tensors for the test images
test_images <- mnist$test$x
test_labels <- mnist$test$y
# Selecting nth training image
digit <- train_images[600,,]
plot(as.raster(digit, max = 300))
# Defining the model
model1 <- keras_model_sequential() %>%
layer_dense(units = 1024, activation = "relu", input_shape = c(28 * 28)) %>%
layer_batch_normalization() %>%
layer_dropout(rate = 0.4) %>%
layer_dense(units = 512, activation = "relu") %>%
layer_batch_normalization() %>%
layer_dense(units = 256, activation = "relu") %>%
layer_dense(units = 10, activation = "softmax")
model1 %>% compile(
optimizer = optimizer_nadam(),
loss = "categorical_crossentropy",
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
# 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
history1 <- model1 %>% fit(
train_images, train_labels,
epochs = 25, batch_size = 128,
validation_split = 0.2
)
## Epoch 1/25
## 375/375 - 11s - loss: 0.4910 - accuracy: 0.8220 - val_loss: 0.4849 - val_accuracy: 0.8283 - 11s/epoch - 28ms/step
## Epoch 2/25
## 375/375 - 7s - loss: 0.3926 - accuracy: 0.8558 - val_loss: 0.4287 - val_accuracy: 0.8435 - 7s/epoch - 20ms/step
## Epoch 3/25
## 375/375 - 8s - loss: 0.3647 - accuracy: 0.8646 - val_loss: 0.3842 - val_accuracy: 0.8618 - 8s/epoch - 20ms/step
## Epoch 4/25
## 375/375 - 7s - loss: 0.3499 - accuracy: 0.8693 - val_loss: 0.3693 - val_accuracy: 0.8639 - 7s/epoch - 20ms/step
## Epoch 5/25
## 375/375 - 8s - loss: 0.3357 - accuracy: 0.8740 - val_loss: 0.3736 - val_accuracy: 0.8644 - 8s/epoch - 21ms/step
## Epoch 6/25
## 375/375 - 7s - loss: 0.3221 - accuracy: 0.8785 - val_loss: 0.3489 - val_accuracy: 0.8722 - 7s/epoch - 20ms/step
## Epoch 7/25
## 375/375 - 7s - loss: 0.3127 - accuracy: 0.8824 - val_loss: 0.3311 - val_accuracy: 0.8733 - 7s/epoch - 20ms/step
## Epoch 8/25
## 375/375 - 12s - loss: 0.3047 - accuracy: 0.8861 - val_loss: 0.3429 - val_accuracy: 0.8758 - 12s/epoch - 31ms/step
## Epoch 9/25
## 375/375 - 8s - loss: 0.2993 - accuracy: 0.8875 - val_loss: 0.3622 - val_accuracy: 0.8727 - 8s/epoch - 20ms/step
## Epoch 10/25
## 375/375 - 8s - loss: 0.2946 - accuracy: 0.8899 - val_loss: 0.3602 - val_accuracy: 0.8643 - 8s/epoch - 20ms/step
## Epoch 11/25
## 375/375 - 7s - loss: 0.2863 - accuracy: 0.8918 - val_loss: 0.3834 - val_accuracy: 0.8598 - 7s/epoch - 20ms/step
## Epoch 12/25
## 375/375 - 7s - loss: 0.2846 - accuracy: 0.8915 - val_loss: 0.3124 - val_accuracy: 0.8867 - 7s/epoch - 20ms/step
## Epoch 13/25
## 375/375 - 7s - loss: 0.2726 - accuracy: 0.8966 - val_loss: 0.3202 - val_accuracy: 0.8870 - 7s/epoch - 20ms/step
## Epoch 14/25
## 375/375 - 7s - loss: 0.2717 - accuracy: 0.8968 - val_loss: 0.3200 - val_accuracy: 0.8850 - 7s/epoch - 20ms/step
## Epoch 15/25
## 375/375 - 7s - loss: 0.2693 - accuracy: 0.8981 - val_loss: 0.3089 - val_accuracy: 0.8878 - 7s/epoch - 19ms/step
## Epoch 16/25
## 375/375 - 7s - loss: 0.2639 - accuracy: 0.8998 - val_loss: 0.3249 - val_accuracy: 0.8811 - 7s/epoch - 20ms/step
## Epoch 17/25
## 375/375 - 7s - loss: 0.2562 - accuracy: 0.9036 - val_loss: 0.3189 - val_accuracy: 0.8885 - 7s/epoch - 19ms/step
## Epoch 18/25
## 375/375 - 7s - loss: 0.2542 - accuracy: 0.9034 - val_loss: 0.3188 - val_accuracy: 0.8870 - 7s/epoch - 19ms/step
## Epoch 19/25
## 375/375 - 7s - loss: 0.2482 - accuracy: 0.9055 - val_loss: 0.3123 - val_accuracy: 0.8879 - 7s/epoch - 20ms/step
## Epoch 20/25
## 375/375 - 7s - loss: 0.2471 - accuracy: 0.9065 - val_loss: 0.3163 - val_accuracy: 0.8898 - 7s/epoch - 19ms/step
## Epoch 21/25
## 375/375 - 7s - loss: 0.2422 - accuracy: 0.9072 - val_loss: 0.3311 - val_accuracy: 0.8859 - 7s/epoch - 19ms/step
## Epoch 22/25
## 375/375 - 7s - loss: 0.2387 - accuracy: 0.9091 - val_loss: 0.3135 - val_accuracy: 0.8903 - 7s/epoch - 19ms/step
## Epoch 23/25
## 375/375 - 7s - loss: 0.2324 - accuracy: 0.9114 - val_loss: 0.3079 - val_accuracy: 0.8922 - 7s/epoch - 20ms/step
## Epoch 24/25
## 375/375 - 7s - loss: 0.2274 - accuracy: 0.9137 - val_loss: 0.3010 - val_accuracy: 0.8953 - 7s/epoch - 19ms/step
## Epoch 25/25
## 375/375 - 7s - loss: 0.2243 - accuracy: 0.9139 - val_loss: 0.3250 - val_accuracy: 0.8907 - 7s/epoch - 19ms/step
# Evaluating the model accuracy
evaluation1 <- model1 %>% evaluate(test_images, test_labels)
## 313/313 - 1s - loss: 0.3576 - accuracy: 0.8809 - 789ms/epoch - 3ms/step
cat("Model 1 Accuracy:", evaluation1[[2]], "\n")
## Model 1 Accuracy: 0.8809
# Plotting the model output
plot(history1)+theme_bw()
### Model 2: Wide network with Adadelta optimizer and mean absolute
error loss
# Defining the model
model2 <- keras_model_sequential() %>%
layer_dense(units = 2048, activation = "relu", input_shape = c(28 * 28)) %>%
layer_dropout(rate = 0.4) %>%
layer_dense(units = 1024, activation = "relu") %>%
layer_dropout(rate = 0.3) %>%
layer_dense(units = 10, activation = "softmax")
model2 %>% compile(
optimizer = optimizer_adadelta(),
loss = "mean_absolute_error",
metrics = c("accuracy")
)
# Training the model
history2 <- model2 %>% fit(
train_images, train_labels,
epochs = 30, batch_size = 1000,
validation_split = 0.2
)
## Epoch 1/30
## 48/48 - 11s - loss: 0.1801 - accuracy: 0.0999 - val_loss: 0.1801 - val_accuracy: 0.1255 - 11s/epoch - 226ms/step
## Epoch 2/30
## 48/48 - 6s - loss: 0.1801 - accuracy: 0.1014 - val_loss: 0.1800 - val_accuracy: 0.1297 - 6s/epoch - 133ms/step
## Epoch 3/30
## 48/48 - 6s - loss: 0.1800 - accuracy: 0.1050 - val_loss: 0.1799 - val_accuracy: 0.1331 - 6s/epoch - 124ms/step
## Epoch 4/30
## 48/48 - 5s - loss: 0.1799 - accuracy: 0.1036 - val_loss: 0.1799 - val_accuracy: 0.1352 - 5s/epoch - 111ms/step
## Epoch 5/30
## 48/48 - 10s - loss: 0.1799 - accuracy: 0.1046 - val_loss: 0.1798 - val_accuracy: 0.1386 - 10s/epoch - 199ms/step
## Epoch 6/30
## 48/48 - 6s - loss: 0.1799 - accuracy: 0.1030 - val_loss: 0.1797 - val_accuracy: 0.1408 - 6s/epoch - 118ms/step
## Epoch 7/30
## 48/48 - 6s - loss: 0.1798 - accuracy: 0.1073 - val_loss: 0.1797 - val_accuracy: 0.1437 - 6s/epoch - 120ms/step
## Epoch 8/30
## 48/48 - 6s - loss: 0.1797 - accuracy: 0.1110 - val_loss: 0.1796 - val_accuracy: 0.1469 - 6s/epoch - 117ms/step
## Epoch 9/30
## 48/48 - 5s - loss: 0.1796 - accuracy: 0.1122 - val_loss: 0.1795 - val_accuracy: 0.1503 - 5s/epoch - 109ms/step
## Epoch 10/30
## 48/48 - 10s - loss: 0.1796 - accuracy: 0.1137 - val_loss: 0.1794 - val_accuracy: 0.1527 - 10s/epoch - 198ms/step
## Epoch 11/30
## 48/48 - 5s - loss: 0.1795 - accuracy: 0.1140 - val_loss: 0.1794 - val_accuracy: 0.1551 - 5s/epoch - 112ms/step
## Epoch 12/30
## 48/48 - 6s - loss: 0.1795 - accuracy: 0.1154 - val_loss: 0.1793 - val_accuracy: 0.1568 - 6s/epoch - 117ms/step
## Epoch 13/30
## 48/48 - 6s - loss: 0.1793 - accuracy: 0.1183 - val_loss: 0.1792 - val_accuracy: 0.1596 - 6s/epoch - 121ms/step
## Epoch 14/30
## 48/48 - 6s - loss: 0.1793 - accuracy: 0.1191 - val_loss: 0.1792 - val_accuracy: 0.1634 - 6s/epoch - 115ms/step
## Epoch 15/30
## 48/48 - 5s - loss: 0.1793 - accuracy: 0.1198 - val_loss: 0.1791 - val_accuracy: 0.1654 - 5s/epoch - 110ms/step
## Epoch 16/30
## 48/48 - 7s - loss: 0.1792 - accuracy: 0.1222 - val_loss: 0.1790 - val_accuracy: 0.1682 - 7s/epoch - 138ms/step
## Epoch 17/30
## 48/48 - 8s - loss: 0.1791 - accuracy: 0.1243 - val_loss: 0.1790 - val_accuracy: 0.1705 - 8s/epoch - 171ms/step
## Epoch 18/30
## 48/48 - 5s - loss: 0.1791 - accuracy: 0.1238 - val_loss: 0.1789 - val_accuracy: 0.1736 - 5s/epoch - 111ms/step
## Epoch 19/30
## 48/48 - 5s - loss: 0.1790 - accuracy: 0.1255 - val_loss: 0.1788 - val_accuracy: 0.1761 - 5s/epoch - 114ms/step
## Epoch 20/30
## 48/48 - 5s - loss: 0.1790 - accuracy: 0.1276 - val_loss: 0.1787 - val_accuracy: 0.1792 - 5s/epoch - 109ms/step
## Epoch 21/30
## 48/48 - 5s - loss: 0.1789 - accuracy: 0.1278 - val_loss: 0.1787 - val_accuracy: 0.1820 - 5s/epoch - 105ms/step
## Epoch 22/30
## 48/48 - 5s - loss: 0.1788 - accuracy: 0.1301 - val_loss: 0.1786 - val_accuracy: 0.1839 - 5s/epoch - 106ms/step
## Epoch 23/30
## 48/48 - 5s - loss: 0.1787 - accuracy: 0.1312 - val_loss: 0.1785 - val_accuracy: 0.1857 - 5s/epoch - 104ms/step
## Epoch 24/30
## 48/48 - 5s - loss: 0.1787 - accuracy: 0.1330 - val_loss: 0.1785 - val_accuracy: 0.1877 - 5s/epoch - 106ms/step
## Epoch 25/30
## 48/48 - 5s - loss: 0.1786 - accuracy: 0.1361 - val_loss: 0.1784 - val_accuracy: 0.1892 - 5s/epoch - 104ms/step
## Epoch 26/30
## 48/48 - 5s - loss: 0.1786 - accuracy: 0.1355 - val_loss: 0.1783 - val_accuracy: 0.1913 - 5s/epoch - 103ms/step
## Epoch 27/30
## 48/48 - 5s - loss: 0.1785 - accuracy: 0.1373 - val_loss: 0.1782 - val_accuracy: 0.1938 - 5s/epoch - 105ms/step
## Epoch 28/30
## 48/48 - 5s - loss: 0.1784 - accuracy: 0.1390 - val_loss: 0.1782 - val_accuracy: 0.1954 - 5s/epoch - 103ms/step
## Epoch 29/30
## 48/48 - 5s - loss: 0.1785 - accuracy: 0.1380 - val_loss: 0.1781 - val_accuracy: 0.1972 - 5s/epoch - 105ms/step
## Epoch 30/30
## 48/48 - 5s - loss: 0.1783 - accuracy: 0.1435 - val_loss: 0.1780 - val_accuracy: 0.1992 - 5s/epoch - 103ms/step
#Evaluating the model performance
evaluation2 <- model2 %>% evaluate(test_images, test_labels)
## 313/313 - 1s - loss: 0.1781 - accuracy: 0.1956 - 1s/epoch - 3ms/step
cat("Model 2 Accuracy:", evaluation2[[2]], "\n")
## Model 2 Accuracy: 0.1956
#Plotting the model
plot(history2)+theme_bw()
# Defining the model
model3 <- keras_model_sequential() %>%
layer_dense(units = 1024, activation = "relu", input_shape = c(28 * 28)) %>%
layer_dropout(rate = 0.4) %>%
layer_dense(units = 512, activation = "relu") %>%
layer_dense(units = 256, activation = "relu") %>%
layer_dense(units = 128, activation = "relu") %>%
layer_dense(units = 10, activation = "softmax")
model3 %>% compile(
optimizer = optimizer_rmsprop(),
loss = "categorical_crossentropy",
metrics = c("accuracy")
)
# Training the model
history3 <- model3 %>% fit(
train_images, train_labels,
epochs = 35, batch_size = 1200,
validation_split = 0.2
)
## Epoch 1/35
## 40/40 - 3s - loss: 1.2084 - accuracy: 0.5607 - val_loss: 0.6867 - val_accuracy: 0.7418 - 3s/epoch - 63ms/step
## Epoch 2/35
## 40/40 - 2s - loss: 0.6691 - accuracy: 0.7500 - val_loss: 0.7565 - val_accuracy: 0.7379 - 2s/epoch - 43ms/step
## Epoch 3/35
## 40/40 - 2s - loss: 0.5799 - accuracy: 0.7869 - val_loss: 0.4931 - val_accuracy: 0.8225 - 2s/epoch - 44ms/step
## Epoch 4/35
## 40/40 - 6s - loss: 0.5119 - accuracy: 0.8086 - val_loss: 0.4726 - val_accuracy: 0.8311 - 6s/epoch - 153ms/step
## Epoch 5/35
## 40/40 - 2s - loss: 0.4705 - accuracy: 0.8239 - val_loss: 0.6352 - val_accuracy: 0.7893 - 2s/epoch - 46ms/step
## Epoch 6/35
## 40/40 - 2s - loss: 0.4422 - accuracy: 0.8356 - val_loss: 0.3846 - val_accuracy: 0.8589 - 2s/epoch - 47ms/step
## Epoch 7/35
## 40/40 - 2s - loss: 0.4310 - accuracy: 0.8386 - val_loss: 0.4316 - val_accuracy: 0.8333 - 2s/epoch - 48ms/step
## Epoch 8/35
## 40/40 - 2s - loss: 0.4049 - accuracy: 0.8492 - val_loss: 0.4074 - val_accuracy: 0.8524 - 2s/epoch - 45ms/step
## Epoch 9/35
## 40/40 - 2s - loss: 0.3895 - accuracy: 0.8541 - val_loss: 0.3840 - val_accuracy: 0.8580 - 2s/epoch - 45ms/step
## Epoch 10/35
## 40/40 - 2s - loss: 0.3803 - accuracy: 0.8575 - val_loss: 0.3645 - val_accuracy: 0.8674 - 2s/epoch - 45ms/step
## Epoch 11/35
## 40/40 - 2s - loss: 0.3622 - accuracy: 0.8648 - val_loss: 0.3863 - val_accuracy: 0.8567 - 2s/epoch - 45ms/step
## Epoch 12/35
## 40/40 - 2s - loss: 0.3511 - accuracy: 0.8674 - val_loss: 0.3649 - val_accuracy: 0.8644 - 2s/epoch - 45ms/step
## Epoch 13/35
## 40/40 - 2s - loss: 0.3456 - accuracy: 0.8703 - val_loss: 0.3660 - val_accuracy: 0.8651 - 2s/epoch - 47ms/step
## Epoch 14/35
## 40/40 - 2s - loss: 0.3336 - accuracy: 0.8730 - val_loss: 0.3873 - val_accuracy: 0.8519 - 2s/epoch - 44ms/step
## Epoch 15/35
## 40/40 - 2s - loss: 0.3291 - accuracy: 0.8756 - val_loss: 0.3475 - val_accuracy: 0.8710 - 2s/epoch - 45ms/step
## Epoch 16/35
## 40/40 - 2s - loss: 0.3185 - accuracy: 0.8790 - val_loss: 0.3648 - val_accuracy: 0.8731 - 2s/epoch - 45ms/step
## Epoch 17/35
## 40/40 - 2s - loss: 0.3129 - accuracy: 0.8815 - val_loss: 0.3566 - val_accuracy: 0.8648 - 2s/epoch - 44ms/step
## Epoch 18/35
## 40/40 - 2s - loss: 0.3048 - accuracy: 0.8831 - val_loss: 0.3541 - val_accuracy: 0.8720 - 2s/epoch - 44ms/step
## Epoch 19/35
## 40/40 - 2s - loss: 0.3005 - accuracy: 0.8845 - val_loss: 0.3260 - val_accuracy: 0.8827 - 2s/epoch - 45ms/step
## Epoch 20/35
## 40/40 - 2s - loss: 0.2962 - accuracy: 0.8873 - val_loss: 0.3521 - val_accuracy: 0.8696 - 2s/epoch - 45ms/step
## Epoch 21/35
## 40/40 - 2s - loss: 0.2911 - accuracy: 0.8892 - val_loss: 0.3480 - val_accuracy: 0.8699 - 2s/epoch - 43ms/step
## Epoch 22/35
## 40/40 - 6s - loss: 0.2875 - accuracy: 0.8907 - val_loss: 0.3064 - val_accuracy: 0.8871 - 6s/epoch - 153ms/step
## Epoch 23/35
## 40/40 - 2s - loss: 0.2814 - accuracy: 0.8914 - val_loss: 0.3352 - val_accuracy: 0.8785 - 2s/epoch - 46ms/step
## Epoch 24/35
## 40/40 - 2s - loss: 0.2743 - accuracy: 0.8951 - val_loss: 0.3121 - val_accuracy: 0.8873 - 2s/epoch - 47ms/step
## Epoch 25/35
## 40/40 - 2s - loss: 0.2722 - accuracy: 0.8957 - val_loss: 0.3047 - val_accuracy: 0.8884 - 2s/epoch - 45ms/step
## Epoch 26/35
## 40/40 - 2s - loss: 0.2674 - accuracy: 0.8979 - val_loss: 0.3276 - val_accuracy: 0.8817 - 2s/epoch - 45ms/step
## Epoch 27/35
## 40/40 - 2s - loss: 0.2614 - accuracy: 0.8997 - val_loss: 0.3345 - val_accuracy: 0.8781 - 2s/epoch - 46ms/step
## Epoch 28/35
## 40/40 - 2s - loss: 0.2591 - accuracy: 0.8993 - val_loss: 0.3137 - val_accuracy: 0.8860 - 2s/epoch - 45ms/step
## Epoch 29/35
## 40/40 - 2s - loss: 0.2519 - accuracy: 0.9023 - val_loss: 0.3057 - val_accuracy: 0.8882 - 2s/epoch - 61ms/step
## Epoch 30/35
## 40/40 - 6s - loss: 0.2461 - accuracy: 0.9048 - val_loss: 0.3450 - val_accuracy: 0.8766 - 6s/epoch - 141ms/step
## Epoch 31/35
## 40/40 - 2s - loss: 0.2485 - accuracy: 0.9036 - val_loss: 0.3235 - val_accuracy: 0.8833 - 2s/epoch - 47ms/step
## Epoch 32/35
## 40/40 - 2s - loss: 0.2411 - accuracy: 0.9063 - val_loss: 0.3274 - val_accuracy: 0.8817 - 2s/epoch - 45ms/step
## Epoch 33/35
## 40/40 - 2s - loss: 0.2441 - accuracy: 0.9054 - val_loss: 0.2947 - val_accuracy: 0.8954 - 2s/epoch - 45ms/step
## Epoch 34/35
## 40/40 - 2s - loss: 0.2399 - accuracy: 0.9075 - val_loss: 0.3098 - val_accuracy: 0.8902 - 2s/epoch - 46ms/step
## Epoch 35/35
## 40/40 - 2s - loss: 0.2325 - accuracy: 0.9098 - val_loss: 0.3308 - val_accuracy: 0.8835 - 2s/epoch - 46ms/step
# Evaluating the model
evaluation3 <- model3 %>% evaluate(test_images, test_labels)
## 313/313 - 1s - loss: 0.3470 - accuracy: 0.8754 - 876ms/epoch - 3ms/step
cat("Model 3 Accuracy:", evaluation3[[2]], "\n")
## Model 3 Accuracy: 0.8754
#Plotting the model
plot(history3)+theme_bw()
Conclusion: Based on the accuracy result, model 1 performs better among
the three models