Load the Libraries

library(keras)
library(tensorflow)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(tidyr)
library(ggplot2)

Load the data

fashion_mnist <- dataset_fashion_mnist()
train_images <- fashion_mnist$train$x
train_labels <- fashion_mnist$train$y
test_images <- fashion_mnist$test$x
test_labels <- fashion_mnist$test$y

Selecting the 1000 training image

digit <- train_images[1000,,]

plotting the image

plot(as.raster(digit, max = 255)) 

Preparing Model 1

Creating Linear stack and layers

network <- keras_model_sequential() %>%
  layer_dense(units = 512, activation = "sigmoid", input_shape = c(28 * 28)) %>%
  layer_dense(units = 256, activation = "sigmoid") %>%
  layer_dense(units = 128, activation = "sigmoid") %>%
  layer_dense(units = 10, activation = "softmax")

Compiling the Models

network %>% compile(
  optimizer = "adam",             
  loss = "categorical_crossentropy", 
  metrics = c("accuracy")     
)

Training the data

train_images <- array_reshape(train_images, c(60000, 28 * 28))
train_images <- train_images / 255

Testing the data

test_images <- array_reshape(test_images, c(10000, 28 * 28))
test_images <- test_images / 255

Check for the dimensions

dim(train_images) 
## [1] 60000   784
dim(test_images)
## [1] 10000   784

One hot encoding

train_labels <- to_categorical(train_labels) 
test_labels <- to_categorical(test_labels)

Checking dimension for train labels

dim(train_labels)
## [1] 60000    10
dim(test_labels)
## [1] 10000    10

Model training

history <- network %>% fit(train_images, train_labels, 
                           epochs = 25, 
                           batch_size = 500, 
                           validation_split = 0.15)
## Epoch 1/25
## 102/102 - 4s - loss: 1.2897 - accuracy: 0.5745 - val_loss: 0.6939 - val_accuracy: 0.7521 - 4s/epoch - 44ms/step
## Epoch 2/25
## 102/102 - 2s - loss: 0.5766 - accuracy: 0.7914 - val_loss: 0.5148 - val_accuracy: 0.8117 - 2s/epoch - 24ms/step
## Epoch 3/25
## 102/102 - 2s - loss: 0.4647 - accuracy: 0.8359 - val_loss: 0.4446 - val_accuracy: 0.8390 - 2s/epoch - 24ms/step
## Epoch 4/25
## 102/102 - 3s - loss: 0.4172 - accuracy: 0.8529 - val_loss: 0.4171 - val_accuracy: 0.8466 - 3s/epoch - 26ms/step
## Epoch 5/25
## 102/102 - 2s - loss: 0.3860 - accuracy: 0.8627 - val_loss: 0.4006 - val_accuracy: 0.8553 - 2s/epoch - 22ms/step
## Epoch 6/25
## 102/102 - 2s - loss: 0.3668 - accuracy: 0.8695 - val_loss: 0.3813 - val_accuracy: 0.8633 - 2s/epoch - 24ms/step
## Epoch 7/25
## 102/102 - 3s - loss: 0.3519 - accuracy: 0.8741 - val_loss: 0.3622 - val_accuracy: 0.8690 - 3s/epoch - 25ms/step
## Epoch 8/25
## 102/102 - 3s - loss: 0.3389 - accuracy: 0.8779 - val_loss: 0.3534 - val_accuracy: 0.8709 - 3s/epoch - 25ms/step
## Epoch 9/25
## 102/102 - 2s - loss: 0.3312 - accuracy: 0.8806 - val_loss: 0.3518 - val_accuracy: 0.8710 - 2s/epoch - 24ms/step
## Epoch 10/25
## 102/102 - 2s - loss: 0.3202 - accuracy: 0.8857 - val_loss: 0.3377 - val_accuracy: 0.8760 - 2s/epoch - 22ms/step
## Epoch 11/25
## 102/102 - 3s - loss: 0.3094 - accuracy: 0.8887 - val_loss: 0.3388 - val_accuracy: 0.8757 - 3s/epoch - 26ms/step
## Epoch 12/25
## 102/102 - 2s - loss: 0.3045 - accuracy: 0.8895 - val_loss: 0.3331 - val_accuracy: 0.8812 - 2s/epoch - 24ms/step
## Epoch 13/25
## 102/102 - 2s - loss: 0.2973 - accuracy: 0.8926 - val_loss: 0.3309 - val_accuracy: 0.8781 - 2s/epoch - 23ms/step
## Epoch 14/25
## 102/102 - 3s - loss: 0.2880 - accuracy: 0.8954 - val_loss: 0.3306 - val_accuracy: 0.8772 - 3s/epoch - 25ms/step
## Epoch 15/25
## 102/102 - 3s - loss: 0.2811 - accuracy: 0.8984 - val_loss: 0.3195 - val_accuracy: 0.8828 - 3s/epoch - 25ms/step
## Epoch 16/25
## 102/102 - 2s - loss: 0.2749 - accuracy: 0.8989 - val_loss: 0.3332 - val_accuracy: 0.8810 - 2s/epoch - 23ms/step
## Epoch 17/25
## 102/102 - 2s - loss: 0.2719 - accuracy: 0.8997 - val_loss: 0.3181 - val_accuracy: 0.8847 - 2s/epoch - 23ms/step
## Epoch 18/25
## 102/102 - 2s - loss: 0.2606 - accuracy: 0.9049 - val_loss: 0.3150 - val_accuracy: 0.8837 - 2s/epoch - 23ms/step
## Epoch 19/25
## 102/102 - 2s - loss: 0.2606 - accuracy: 0.9055 - val_loss: 0.3140 - val_accuracy: 0.8860 - 2s/epoch - 23ms/step
## Epoch 20/25
## 102/102 - 3s - loss: 0.2524 - accuracy: 0.9076 - val_loss: 0.3163 - val_accuracy: 0.8828 - 3s/epoch - 33ms/step
## Epoch 21/25
## 102/102 - 2s - loss: 0.2456 - accuracy: 0.9099 - val_loss: 0.3076 - val_accuracy: 0.8879 - 2s/epoch - 24ms/step
## Epoch 22/25
## 102/102 - 3s - loss: 0.2419 - accuracy: 0.9115 - val_loss: 0.3050 - val_accuracy: 0.8882 - 3s/epoch - 25ms/step
## Epoch 23/25
## 102/102 - 3s - loss: 0.2368 - accuracy: 0.9129 - val_loss: 0.3085 - val_accuracy: 0.8889 - 3s/epoch - 25ms/step
## Epoch 24/25
## 102/102 - 4s - loss: 0.2293 - accuracy: 0.9160 - val_loss: 0.3088 - val_accuracy: 0.8894 - 4s/epoch - 39ms/step
## Epoch 25/25
## 102/102 - 3s - loss: 0.2251 - accuracy: 0.9170 - val_loss: 0.3110 - val_accuracy: 0.8878 - 3s/epoch - 29ms/step

Plot

plot(history)+theme_minimal()

Creating Model 2

Creating linear stack and layers

network2 <- keras_model_sequential() %>%
  layer_conv_2d(filters = 32, kernel_size = c(3, 3), activation = "tanh", input_shape = c(28, 28, 1)) %>% 
  layer_max_pooling_2d(pool_size = c(2, 2)) %>% 
  layer_conv_2d(filters = 64, kernel_size = c(3, 3), activation = "tanh") %>%
  layer_max_pooling_2d(pool_size = c(2, 2)) %>% 
  layer_flatten() %>% 
  layer_dense(units = 10, activation = "softmax")

Reshaping training images

train_images <- array_reshape(train_images, c(60000, 28 , 28,1))
train_images <- train_images / 255

Reshaping testing image

test_images <- array_reshape(test_images, c(10000, 28, 28,1))
test_images <- test_images / 255

Compiling the models

network2 %>% compile(
  optimizer = "adam",             
  loss = "categorical_crossentropy", 
  metrics = c("accuracy")     
)

Model training

history2 <-network2 %>% fit(train_images, train_labels, 
                           epochs = 20, 
                           batch_size = 1000, 
                           validation_split = 0.1)
## Epoch 1/20
## 54/54 - 15s - loss: 2.2029 - accuracy: 0.3302 - val_loss: 1.8617 - val_accuracy: 0.4457 - 15s/epoch - 283ms/step
## Epoch 2/20
## 54/54 - 14s - loss: 1.3163 - accuracy: 0.5931 - val_loss: 0.9610 - val_accuracy: 0.6732 - 14s/epoch - 255ms/step
## Epoch 3/20
## 54/54 - 14s - loss: 0.8668 - accuracy: 0.6952 - val_loss: 0.7849 - val_accuracy: 0.7123 - 14s/epoch - 250ms/step
## Epoch 4/20
## 54/54 - 14s - loss: 0.7703 - accuracy: 0.7226 - val_loss: 0.7274 - val_accuracy: 0.7348 - 14s/epoch - 250ms/step
## Epoch 5/20
## 54/54 - 13s - loss: 0.7250 - accuracy: 0.7362 - val_loss: 0.6909 - val_accuracy: 0.7467 - 13s/epoch - 248ms/step
## Epoch 6/20
## 54/54 - 14s - loss: 0.6944 - accuracy: 0.7453 - val_loss: 0.6666 - val_accuracy: 0.7577 - 14s/epoch - 251ms/step
## Epoch 7/20
## 54/54 - 14s - loss: 0.6725 - accuracy: 0.7554 - val_loss: 0.6459 - val_accuracy: 0.7637 - 14s/epoch - 250ms/step
## Epoch 8/20
## 54/54 - 13s - loss: 0.6545 - accuracy: 0.7620 - val_loss: 0.6349 - val_accuracy: 0.7615 - 13s/epoch - 250ms/step
## Epoch 9/20
## 54/54 - 14s - loss: 0.6390 - accuracy: 0.7673 - val_loss: 0.6141 - val_accuracy: 0.7720 - 14s/epoch - 252ms/step
## Epoch 10/20
## 54/54 - 14s - loss: 0.6226 - accuracy: 0.7739 - val_loss: 0.6003 - val_accuracy: 0.7780 - 14s/epoch - 250ms/step
## Epoch 11/20
## 54/54 - 14s - loss: 0.6093 - accuracy: 0.7796 - val_loss: 0.5882 - val_accuracy: 0.7793 - 14s/epoch - 261ms/step
## Epoch 12/20
## 54/54 - 14s - loss: 0.5971 - accuracy: 0.7839 - val_loss: 0.5792 - val_accuracy: 0.7828 - 14s/epoch - 250ms/step
## Epoch 13/20
## 54/54 - 14s - loss: 0.5846 - accuracy: 0.7886 - val_loss: 0.5664 - val_accuracy: 0.7900 - 14s/epoch - 251ms/step
## Epoch 14/20
## 54/54 - 14s - loss: 0.5746 - accuracy: 0.7935 - val_loss: 0.5549 - val_accuracy: 0.7938 - 14s/epoch - 250ms/step
## Epoch 15/20
## 54/54 - 14s - loss: 0.5665 - accuracy: 0.7950 - val_loss: 0.5539 - val_accuracy: 0.7945 - 14s/epoch - 252ms/step
## Epoch 16/20
## 54/54 - 16s - loss: 0.5573 - accuracy: 0.7993 - val_loss: 0.5411 - val_accuracy: 0.7988 - 16s/epoch - 291ms/step
## Epoch 17/20
## 54/54 - 14s - loss: 0.5520 - accuracy: 0.8024 - val_loss: 0.5331 - val_accuracy: 0.8052 - 14s/epoch - 251ms/step
## Epoch 18/20
## 54/54 - 14s - loss: 0.5398 - accuracy: 0.8059 - val_loss: 0.5298 - val_accuracy: 0.8042 - 14s/epoch - 252ms/step
## Epoch 19/20
## 54/54 - 13s - loss: 0.5345 - accuracy: 0.8076 - val_loss: 0.5206 - val_accuracy: 0.8112 - 13s/epoch - 250ms/step
## Epoch 20/20
## 54/54 - 14s - loss: 0.5267 - accuracy: 0.8105 - val_loss: 0.5111 - val_accuracy: 0.8145 - 14s/epoch - 257ms/step

Plot

plot(history2)+theme_bw()

Creating model 3

Creating linear stacks and layers

network3 <- keras_model_sequential() %>%
  layer_dense(units = 512, activation = "relu", input_shape = c(28 * 28)) %>%  
  layer_dropout(rate = 0.4) %>%
  layer_batch_normalization() %>%
  layer_dense(units = 256, activation = "relu") %>%  
  layer_dropout(rate = 0.3) %>%
  layer_batch_normalization() %>%
  layer_dense(units = 128, activation = "relu") %>%  
  layer_dropout(rate = 0.2) %>%
  layer_dense(units = 64, activation = "relu") %>%    
  layer_dense(units = 10, activation = "softmax") 

Training the data

train_images <- array_reshape(train_images, c(60000, 28 * 28))
train_images <- train_images / 255

Testing the data

test_images <- array_reshape(test_images, c(10000, 28 * 28))
test_images <- test_images / 255

Compiling the models

network3 %>% compile(
  optimizer = optimizer_rmsprop(lr=0.001),             
  loss = 'hinge', 
  metrics = c("accuracy")     
)

Model training

history3 <-network3 %>% fit(train_images, train_labels, 
                           epochs = 30, 
                           batch_size = 500, 
                           validation_split = 0.25)
## Epoch 1/30
## 90/90 - 6s - loss: 1.0800 - accuracy: 0.0986 - val_loss: 1.0800 - val_accuracy: 0.0961 - 6s/epoch - 70ms/step
## Epoch 2/30
## 90/90 - 3s - loss: 1.0800 - accuracy: 0.1001 - val_loss: 1.0800 - val_accuracy: 0.0961 - 3s/epoch - 34ms/step
## Epoch 3/30
## 90/90 - 6s - loss: 1.0799 - accuracy: 0.1018 - val_loss: 1.0801 - val_accuracy: 0.0961 - 6s/epoch - 64ms/step
## Epoch 4/30
## 90/90 - 6s - loss: 1.0800 - accuracy: 0.1003 - val_loss: 1.0801 - val_accuracy: 0.0961 - 6s/epoch - 66ms/step
## Epoch 5/30
## 90/90 - 4s - loss: 1.0799 - accuracy: 0.1018 - val_loss: 1.0802 - val_accuracy: 0.0961 - 4s/epoch - 45ms/step
## Epoch 6/30
## 90/90 - 3s - loss: 1.0798 - accuracy: 0.1009 - val_loss: 1.0802 - val_accuracy: 0.0961 - 3s/epoch - 36ms/step
## Epoch 7/30
## 90/90 - 3s - loss: 1.0799 - accuracy: 0.1014 - val_loss: 1.0804 - val_accuracy: 0.0961 - 3s/epoch - 38ms/step
## Epoch 8/30
## 90/90 - 4s - loss: 1.0797 - accuracy: 0.1016 - val_loss: 1.0803 - val_accuracy: 0.0961 - 4s/epoch - 40ms/step
## Epoch 9/30
## 90/90 - 4s - loss: 1.0798 - accuracy: 0.1014 - val_loss: 1.0804 - val_accuracy: 0.0961 - 4s/epoch - 39ms/step
## Epoch 10/30
## 90/90 - 3s - loss: 1.0799 - accuracy: 0.1009 - val_loss: 1.0805 - val_accuracy: 0.0961 - 3s/epoch - 39ms/step
## Epoch 11/30
## 90/90 - 5s - loss: 1.0798 - accuracy: 0.1012 - val_loss: 1.0803 - val_accuracy: 0.0961 - 5s/epoch - 53ms/step
## Epoch 12/30
## 90/90 - 4s - loss: 1.0799 - accuracy: 0.1014 - val_loss: 1.0805 - val_accuracy: 0.0961 - 4s/epoch - 42ms/step
## Epoch 13/30
## 90/90 - 6s - loss: 1.0798 - accuracy: 0.1009 - val_loss: 1.0804 - val_accuracy: 0.0961 - 6s/epoch - 65ms/step
## Epoch 14/30
## 90/90 - 6s - loss: 1.0798 - accuracy: 0.1014 - val_loss: 1.0806 - val_accuracy: 0.0961 - 6s/epoch - 64ms/step
## Epoch 15/30
## 90/90 - 6s - loss: 1.0797 - accuracy: 0.1014 - val_loss: 1.0805 - val_accuracy: 0.0961 - 6s/epoch - 66ms/step
## Epoch 16/30
## 90/90 - 3s - loss: 1.0799 - accuracy: 0.1007 - val_loss: 1.0807 - val_accuracy: 0.0961 - 3s/epoch - 35ms/step
## Epoch 17/30
## 90/90 - 4s - loss: 1.0798 - accuracy: 0.1019 - val_loss: 1.0807 - val_accuracy: 0.0961 - 4s/epoch - 47ms/step
## Epoch 18/30
## 90/90 - 3s - loss: 1.0798 - accuracy: 0.1015 - val_loss: 1.0807 - val_accuracy: 0.0961 - 3s/epoch - 38ms/step
## Epoch 19/30
## 90/90 - 6s - loss: 1.0797 - accuracy: 0.1012 - val_loss: 1.0807 - val_accuracy: 0.0961 - 6s/epoch - 61ms/step
## Epoch 20/30
## 90/90 - 4s - loss: 1.0797 - accuracy: 0.1013 - val_loss: 1.0806 - val_accuracy: 0.0961 - 4s/epoch - 50ms/step
## Epoch 21/30
## 90/90 - 6s - loss: 1.0798 - accuracy: 0.1011 - val_loss: 1.0806 - val_accuracy: 0.0961 - 6s/epoch - 64ms/step
## Epoch 22/30
## 90/90 - 6s - loss: 1.0798 - accuracy: 0.1012 - val_loss: 1.0806 - val_accuracy: 0.0961 - 6s/epoch - 64ms/step
## Epoch 23/30
## 90/90 - 6s - loss: 1.0798 - accuracy: 0.1001 - val_loss: 1.0807 - val_accuracy: 0.0961 - 6s/epoch - 63ms/step
## Epoch 24/30
## 90/90 - 4s - loss: 1.0799 - accuracy: 0.1009 - val_loss: 1.0806 - val_accuracy: 0.0961 - 4s/epoch - 39ms/step
## Epoch 25/30
## 90/90 - 4s - loss: 1.0799 - accuracy: 0.1014 - val_loss: 1.0807 - val_accuracy: 0.0961 - 4s/epoch - 40ms/step
## Epoch 26/30
## 90/90 - 6s - loss: 1.0798 - accuracy: 0.1011 - val_loss: 1.0806 - val_accuracy: 0.0961 - 6s/epoch - 65ms/step
## Epoch 27/30
## 90/90 - 6s - loss: 1.0797 - accuracy: 0.1018 - val_loss: 1.0806 - val_accuracy: 0.0961 - 6s/epoch - 67ms/step
## Epoch 28/30
## 90/90 - 5s - loss: 1.0797 - accuracy: 0.1010 - val_loss: 1.0807 - val_accuracy: 0.0961 - 5s/epoch - 59ms/step
## Epoch 29/30
## 90/90 - 6s - loss: 1.0798 - accuracy: 0.1012 - val_loss: 1.0807 - val_accuracy: 0.0961 - 6s/epoch - 64ms/step
## Epoch 30/30
## 90/90 - 6s - loss: 1.0798 - accuracy: 0.1006 - val_loss: 1.0807 - val_accuracy: 0.0961 - 6s/epoch - 62ms/step

plot

plot(history3)+theme_minimal()

Comments:

In the three models we have created, model 1 have the highest accuracy and model 3 has the lowest accuracy. SO, model 1 is found to be the most preferred model.