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.