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 the image
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(lr=0.01),
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 the dimension
dim(train_images)
## [1] 60000 784
dim(test_images)
## [1] 10000 784
One-hot encoding of the labels
train_labels <- to_categorical(train_labels)
test_labels <- to_categorical(test_labels)
Defining the class labels
class_labels <- c('T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat',
'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot')
Training the model
Fit1 <- model1 %>% fit(
train_images, train_labels,
epochs = 25, batch_size = 800,
validation_split = 0.1
)
## Epoch 1/25
## 68/68 - 2s - loss: 0.0344 - accuracy: 0.7517 - val_loss: 0.0243 - val_accuracy: 0.8352 - 2s/epoch - 35ms/step
## Epoch 2/25
## 68/68 - 2s - loss: 0.0217 - accuracy: 0.8481 - val_loss: 0.0207 - val_accuracy: 0.8555 - 2s/epoch - 23ms/step
## Epoch 3/25
## 68/68 - 1s - loss: 0.0194 - accuracy: 0.8669 - val_loss: 0.0197 - val_accuracy: 0.8627 - 1s/epoch - 22ms/step
## Epoch 4/25
## 68/68 - 2s - loss: 0.0178 - accuracy: 0.8784 - val_loss: 0.0189 - val_accuracy: 0.8688 - 2s/epoch - 22ms/step
## Epoch 5/25
## 68/68 - 2s - loss: 0.0168 - accuracy: 0.8862 - val_loss: 0.0179 - val_accuracy: 0.8730 - 2s/epoch - 23ms/step
## Epoch 6/25
## 68/68 - 2s - loss: 0.0160 - accuracy: 0.8914 - val_loss: 0.0171 - val_accuracy: 0.8815 - 2s/epoch - 22ms/step
## Epoch 7/25
## 68/68 - 2s - loss: 0.0154 - accuracy: 0.8960 - val_loss: 0.0173 - val_accuracy: 0.8778 - 2s/epoch - 24ms/step
## Epoch 8/25
## 68/68 - 2s - loss: 0.0147 - accuracy: 0.9010 - val_loss: 0.0176 - val_accuracy: 0.8815 - 2s/epoch - 23ms/step
## Epoch 9/25
## 68/68 - 2s - loss: 0.0141 - accuracy: 0.9059 - val_loss: 0.0163 - val_accuracy: 0.8857 - 2s/epoch - 23ms/step
## Epoch 10/25
## 68/68 - 2s - loss: 0.0138 - accuracy: 0.9067 - val_loss: 0.0163 - val_accuracy: 0.8867 - 2s/epoch - 22ms/step
## Epoch 11/25
## 68/68 - 2s - loss: 0.0132 - accuracy: 0.9116 - val_loss: 0.0162 - val_accuracy: 0.8877 - 2s/epoch - 22ms/step
## Epoch 12/25
## 68/68 - 2s - loss: 0.0127 - accuracy: 0.9160 - val_loss: 0.0158 - val_accuracy: 0.8920 - 2s/epoch - 22ms/step
## Epoch 13/25
## 68/68 - 2s - loss: 0.0124 - accuracy: 0.9180 - val_loss: 0.0159 - val_accuracy: 0.8922 - 2s/epoch - 22ms/step
## Epoch 14/25
## 68/68 - 2s - loss: 0.0120 - accuracy: 0.9219 - val_loss: 0.0164 - val_accuracy: 0.8852 - 2s/epoch - 22ms/step
## Epoch 15/25
## 68/68 - 2s - loss: 0.0120 - accuracy: 0.9201 - val_loss: 0.0166 - val_accuracy: 0.8852 - 2s/epoch - 23ms/step
## Epoch 16/25
## 68/68 - 2s - loss: 0.0118 - accuracy: 0.9227 - val_loss: 0.0161 - val_accuracy: 0.8903 - 2s/epoch - 24ms/step
## Epoch 17/25
## 68/68 - 2s - loss: 0.0111 - accuracy: 0.9277 - val_loss: 0.0156 - val_accuracy: 0.8947 - 2s/epoch - 22ms/step
## Epoch 18/25
## 68/68 - 2s - loss: 0.0106 - accuracy: 0.9314 - val_loss: 0.0153 - val_accuracy: 0.8970 - 2s/epoch - 22ms/step
## Epoch 19/25
## 68/68 - 2s - loss: 0.0103 - accuracy: 0.9338 - val_loss: 0.0150 - val_accuracy: 0.8983 - 2s/epoch - 22ms/step
## Epoch 20/25
## 68/68 - 2s - loss: 0.0106 - accuracy: 0.9307 - val_loss: 0.0161 - val_accuracy: 0.8897 - 2s/epoch - 22ms/step
## Epoch 21/25
## 68/68 - 2s - loss: 0.0100 - accuracy: 0.9343 - val_loss: 0.0159 - val_accuracy: 0.8918 - 2s/epoch - 23ms/step
## Epoch 22/25
## 68/68 - 2s - loss: 0.0099 - accuracy: 0.9363 - val_loss: 0.0154 - val_accuracy: 0.8942 - 2s/epoch - 24ms/step
## Epoch 23/25
## 68/68 - 2s - loss: 0.0094 - accuracy: 0.9393 - val_loss: 0.0153 - val_accuracy: 0.8977 - 2s/epoch - 24ms/step
## Epoch 24/25
## 68/68 - 2s - loss: 0.0092 - accuracy: 0.9413 - val_loss: 0.0157 - val_accuracy: 0.8923 - 2s/epoch - 23ms/step
## Epoch 25/25
## 68/68 - 2s - loss: 0.0087 - accuracy: 0.9450 - val_loss: 0.0162 - val_accuracy: 0.8923 - 2s/epoch - 22ms/step
Testing the model
evaluation1 <- model1 %>% evaluate(test_images, test_labels)
## 313/313 - 1s - loss: 0.0169 - accuracy: 0.8874 - 545ms/epoch - 2ms/step
cat("Model 1 Accuracy:", evaluation1[2], "\n")
## Model 1 Accuracy: 0.8874
Plotting the model result
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 - 1s - loss: 1.0626 - accuracy: 0.6352 - val_loss: 0.6719 - val_accuracy: 0.7296 - 1s/epoch - 40ms/step
## Epoch 2/22
## 35/35 - 1s - loss: 0.6394 - accuracy: 0.7633 - val_loss: 0.4898 - val_accuracy: 0.8216 - 811ms/epoch - 23ms/step
## Epoch 3/22
## 35/35 - 1s - loss: 0.5653 - accuracy: 0.7922 - val_loss: 0.5070 - val_accuracy: 0.7986 - 798ms/epoch - 23ms/step
## Epoch 4/22
## 35/35 - 1s - loss: 0.5128 - accuracy: 0.8076 - val_loss: 0.4395 - val_accuracy: 0.8349 - 809ms/epoch - 23ms/step
## Epoch 5/22
## 35/35 - 1s - loss: 0.4867 - accuracy: 0.8223 - val_loss: 0.4957 - val_accuracy: 0.8147 - 832ms/epoch - 24ms/step
## Epoch 6/22
## 35/35 - 1s - loss: 0.4617 - accuracy: 0.8298 - val_loss: 0.4177 - val_accuracy: 0.8464 - 804ms/epoch - 23ms/step
## Epoch 7/22
## 35/35 - 1s - loss: 0.4395 - accuracy: 0.8371 - val_loss: 0.4000 - val_accuracy: 0.8552 - 832ms/epoch - 24ms/step
## Epoch 8/22
## 35/35 - 1s - loss: 0.4152 - accuracy: 0.8477 - val_loss: 0.4256 - val_accuracy: 0.8435 - 863ms/epoch - 25ms/step
## Epoch 9/22
## 35/35 - 1s - loss: 0.4071 - accuracy: 0.8495 - val_loss: 0.4242 - val_accuracy: 0.8409 - 956ms/epoch - 27ms/step
## Epoch 10/22
## 35/35 - 1s - loss: 0.3940 - accuracy: 0.8531 - val_loss: 0.4524 - val_accuracy: 0.8388 - 912ms/epoch - 26ms/step
## Epoch 11/22
## 35/35 - 1s - loss: 0.3816 - accuracy: 0.8582 - val_loss: 0.3566 - val_accuracy: 0.8688 - 865ms/epoch - 25ms/step
## Epoch 12/22
## 35/35 - 1s - loss: 0.3819 - accuracy: 0.8573 - val_loss: 0.3674 - val_accuracy: 0.8648 - 857ms/epoch - 24ms/step
## Epoch 13/22
## 35/35 - 1s - loss: 0.3631 - accuracy: 0.8657 - val_loss: 0.4003 - val_accuracy: 0.8529 - 868ms/epoch - 25ms/step
## Epoch 14/22
## 35/35 - 1s - loss: 0.3559 - accuracy: 0.8688 - val_loss: 0.3481 - val_accuracy: 0.8702 - 857ms/epoch - 24ms/step
## Epoch 15/22
## 35/35 - 1s - loss: 0.3482 - accuracy: 0.8698 - val_loss: 0.3802 - val_accuracy: 0.8636 - 862ms/epoch - 25ms/step
## Epoch 16/22
## 35/35 - 1s - loss: 0.3456 - accuracy: 0.8704 - val_loss: 0.3421 - val_accuracy: 0.8722 - 857ms/epoch - 24ms/step
## Epoch 17/22
## 35/35 - 1s - loss: 0.3427 - accuracy: 0.8722 - val_loss: 0.3262 - val_accuracy: 0.8796 - 864ms/epoch - 25ms/step
## Epoch 18/22
## 35/35 - 1s - loss: 0.3349 - accuracy: 0.8766 - val_loss: 0.3484 - val_accuracy: 0.8677 - 885ms/epoch - 25ms/step
## Epoch 19/22
## 35/35 - 1s - loss: 0.3273 - accuracy: 0.8779 - val_loss: 0.3943 - val_accuracy: 0.8629 - 869ms/epoch - 25ms/step
## Epoch 20/22
## 35/35 - 1s - loss: 0.3219 - accuracy: 0.8793 - val_loss: 0.3384 - val_accuracy: 0.8778 - 911ms/epoch - 26ms/step
## Epoch 21/22
## 35/35 - 1s - loss: 0.3185 - accuracy: 0.8802 - val_loss: 0.3203 - val_accuracy: 0.8842 - 854ms/epoch - 24ms/step
## Epoch 22/22
## 35/35 - 1s - loss: 0.3136 - accuracy: 0.8821 - val_loss: 0.3451 - val_accuracy: 0.8762 - 795ms/epoch - 23ms/step
Testing the model
evaluation2 <- model2 %>% evaluate(test_images, test_labels)
## 313/313 - 1s - loss: 0.3730 - accuracy: 0.8674 - 541ms/epoch - 2ms/step
cat("Model 2 Accuracy:", evaluation2[2], "\n")
## Model 2 Accuracy: 0.8674
Plotting the the model result
#Plotting the model result
plot(fit2)+theme_bw()
Defining 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(lr=0.03),
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.2168 - accuracy: 0.5689 - val_loss: 0.1571 - val_accuracy: 0.6719 - 2s/epoch - 44ms/step
## Epoch 2/30
## 40/40 - 1s - loss: 0.1242 - accuracy: 0.7364 - val_loss: 0.1192 - val_accuracy: 0.7414 - 1s/epoch - 29ms/step
## Epoch 3/30
## 40/40 - 1s - loss: 0.1046 - accuracy: 0.7807 - val_loss: 0.1042 - val_accuracy: 0.7843 - 1s/epoch - 29ms/step
## Epoch 4/30
## 40/40 - 1s - loss: 0.0948 - accuracy: 0.7999 - val_loss: 0.0903 - val_accuracy: 0.8170 - 1s/epoch - 30ms/step
## Epoch 5/30
## 40/40 - 1s - loss: 0.0870 - accuracy: 0.8206 - val_loss: 0.0911 - val_accuracy: 0.8072 - 1s/epoch - 29ms/step
## Epoch 6/30
## 40/40 - 1s - loss: 0.0833 - accuracy: 0.8265 - val_loss: 0.0781 - val_accuracy: 0.8453 - 1s/epoch - 28ms/step
## Epoch 7/30
## 40/40 - 1s - loss: 0.0782 - accuracy: 0.8392 - val_loss: 0.0738 - val_accuracy: 0.8528 - 1s/epoch - 31ms/step
## Epoch 8/30
## 40/40 - 1s - loss: 0.0758 - accuracy: 0.8426 - val_loss: 0.0779 - val_accuracy: 0.8360 - 1s/epoch - 29ms/step
## Epoch 9/30
## 40/40 - 1s - loss: 0.0738 - accuracy: 0.8469 - val_loss: 0.0727 - val_accuracy: 0.8479 - 1s/epoch - 28ms/step
## Epoch 10/30
## 40/40 - 1s - loss: 0.0705 - accuracy: 0.8546 - val_loss: 0.0726 - val_accuracy: 0.8531 - 1s/epoch - 29ms/step
## Epoch 11/30
## 40/40 - 1s - loss: 0.0691 - accuracy: 0.8568 - val_loss: 0.0700 - val_accuracy: 0.8582 - 1s/epoch - 29ms/step
## Epoch 12/30
## 40/40 - 1s - loss: 0.0676 - accuracy: 0.8607 - val_loss: 0.0713 - val_accuracy: 0.8497 - 1s/epoch - 28ms/step
## Epoch 13/30
## 40/40 - 1s - loss: 0.0663 - accuracy: 0.8638 - val_loss: 0.0684 - val_accuracy: 0.8596 - 1s/epoch - 28ms/step
## Epoch 14/30
## 40/40 - 1s - loss: 0.0635 - accuracy: 0.8693 - val_loss: 0.0785 - val_accuracy: 0.8316 - 1s/epoch - 28ms/step
## Epoch 15/30
## 40/40 - 1s - loss: 0.0641 - accuracy: 0.8688 - val_loss: 0.0697 - val_accuracy: 0.8594 - 1s/epoch - 28ms/step
## Epoch 16/30
## 40/40 - 1s - loss: 0.0631 - accuracy: 0.8693 - val_loss: 0.0667 - val_accuracy: 0.8616 - 1s/epoch - 29ms/step
## Epoch 17/30
## 40/40 - 1s - loss: 0.0613 - accuracy: 0.8732 - val_loss: 0.0624 - val_accuracy: 0.8721 - 1s/epoch - 30ms/step
## Epoch 18/30
## 40/40 - 1s - loss: 0.0597 - accuracy: 0.8779 - val_loss: 0.0619 - val_accuracy: 0.8745 - 1s/epoch - 28ms/step
## Epoch 19/30
## 40/40 - 1s - loss: 0.0588 - accuracy: 0.8795 - val_loss: 0.0650 - val_accuracy: 0.8671 - 1s/epoch - 29ms/step
## Epoch 20/30
## 40/40 - 1s - loss: 0.0587 - accuracy: 0.8788 - val_loss: 0.0664 - val_accuracy: 0.8617 - 1s/epoch - 29ms/step
## Epoch 21/30
## 40/40 - 1s - loss: 0.0569 - accuracy: 0.8832 - val_loss: 0.0658 - val_accuracy: 0.8621 - 1s/epoch - 28ms/step
## Epoch 22/30
## 40/40 - 1s - loss: 0.0566 - accuracy: 0.8849 - val_loss: 0.0655 - val_accuracy: 0.8673 - 1s/epoch - 28ms/step
## Epoch 23/30
## 40/40 - 1s - loss: 0.0560 - accuracy: 0.8851 - val_loss: 0.0637 - val_accuracy: 0.8696 - 1s/epoch - 28ms/step
## Epoch 24/30
## 40/40 - 1s - loss: 0.0551 - accuracy: 0.8883 - val_loss: 0.0598 - val_accuracy: 0.8768 - 1s/epoch - 28ms/step
## Epoch 25/30
## 40/40 - 1s - loss: 0.0546 - accuracy: 0.8878 - val_loss: 0.0596 - val_accuracy: 0.8763 - 1s/epoch - 28ms/step
## Epoch 26/30
## 40/40 - 1s - loss: 0.0531 - accuracy: 0.8917 - val_loss: 0.0642 - val_accuracy: 0.8717 - 1s/epoch - 30ms/step
## Epoch 27/30
## 40/40 - 1s - loss: 0.0530 - accuracy: 0.8922 - val_loss: 0.0605 - val_accuracy: 0.8760 - 1s/epoch - 32ms/step
## Epoch 28/30
## 40/40 - 1s - loss: 0.0510 - accuracy: 0.8961 - val_loss: 0.0621 - val_accuracy: 0.8764 - 1s/epoch - 29ms/step
## Epoch 29/30
## 40/40 - 1s - loss: 0.0515 - accuracy: 0.8947 - val_loss: 0.0581 - val_accuracy: 0.8812 - 1s/epoch - 31ms/step
## Epoch 30/30
## 40/40 - 1s - loss: 0.0497 - accuracy: 0.8977 - val_loss: 0.0615 - val_accuracy: 0.8729 - 1s/epoch - 31ms/step
Tesing the model
evaluation3 <- model3 %>% evaluate(test_images, test_labels)
## 313/313 - 1s - loss: 0.0667 - accuracy: 0.8657 - 669ms/epoch - 2ms/step
cat("Model 3 Accuracy:", evaluation3[2], "\n")
## Model 3 Accuracy: 0.8657
Plotting the model result
plot(fit3)+theme_bw()
Conclusion