{"metadata":{"kernelspec":{"name":"ir","display_name":"R","language":"R"},"language_info":{"name":"R","codemirror_mode":"r","pygments_lexer":"r","mimetype":"text/x-r-source","file_extension":".r","version":"4.0.5"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"## Load necessary libraries","metadata":{}},{"cell_type":"code","source":"library(tidyverse)\n\nlibrary(keras)\nlibrary(reticulate)","metadata":{"_uuid":"051d70d956493feee0c6d64651c6a088724dca2a","_execution_state":"idle","execution":{"iopub.status.busy":"2022-02-03T17:52:42.295595Z","iopub.execute_input":"2022-02-03T17:52:42.297862Z","iopub.status.idle":"2022-02-03T17:52:44.327282Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Load data","metadata":{}},{"cell_type":"code","source":"train_data <- read_csv('../input/Kannada-MNIST/train.csv')%>% select(-label)\ntrain_labels <- read_csv('../input/Kannada-MNIST/train.csv') %>% select(label)\n\nval_data <- read_csv('../input/Kannada-MNIST/Dig-MNIST.csv') %>% select(-label)\nval_labels <- read_csv('../input/Kannada-MNIST/Dig-MNIST.csv') %>% select(label)\n\ntest_data <- read_csv('../input/Kannada-MNIST/test.csv') %>% select(-id)","metadata":{"execution":{"iopub.status.busy":"2022-02-03T17:52:47.322448Z","iopub.execute_input":"2022-02-03T17:52:47.359395Z","iopub.status.idle":"2022-02-03T17:52:52.725893Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Data preparation","metadata":{}},{"cell_type":"code","source":"x_train <- as.matrix(train_data) / 255\nx_val <- as.matrix(val_data) / 255\n\nx_test <- as.matrix(test_data) / 255","metadata":{"execution":{"iopub.status.busy":"2022-02-03T17:52:56.554068Z","iopub.execute_input":"2022-02-03T17:52:56.555503Z","iopub.status.idle":"2022-02-03T17:53:06.360609Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"nRows <- 28\nnCols <- 28","metadata":{"execution":{"iopub.status.busy":"2022-02-03T17:53:10.734867Z","iopub.execute_input":"2022-02-03T17:53:10.736239Z","iopub.status.idle":"2022-02-03T17:53:10.748888Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"## Redefine  dimension of train, validation and test inputs\nx_train <- array_reshape(x_train, c(nrow(x_train), nRows, nCols, 1))\nx_val <- array_reshape(x_val, c(nrow(x_val), nRows, nCols, 1))\n\nx_test <- array_reshape(x_test, c(nrow(x_test), nRows, nCols, 1))\n\ninput_shape <- c(nRows, nCols, 1)","metadata":{"execution":{"iopub.status.busy":"2022-02-03T17:53:12.852938Z","iopub.execute_input":"2022-02-03T17:53:12.854319Z","iopub.status.idle":"2022-02-03T17:53:15.569189Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"batch_size <- 128\nnum_classes <- 10\nepochs <- 30","metadata":{"execution":{"iopub.status.busy":"2022-02-03T17:53:18.975158Z","iopub.execute_input":"2022-02-03T17:53:18.976523Z","iopub.status.idle":"2022-02-03T17:53:18.990861Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"## Convert class vectors to binary class matrices\ny_train <- to_categorical(as.matrix(train_labels), num_classes)\ny_val <- to_categorical(as.matrix(val_labels), num_classes)","metadata":{"execution":{"iopub.status.busy":"2022-02-03T17:53:22.119920Z","iopub.execute_input":"2022-02-03T17:53:22.121461Z","iopub.status.idle":"2022-02-03T17:53:26.939746Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Define model","metadata":{}},{"cell_type":"code","source":"model <- keras_model_sequential() %>%\n  \n  layer_conv_2d(filters = 32, \n                kernel_size = c(3,3), kernel_initializer = 'he_normal',\n                kernel_regularizer = 'l2',\n                activation = 'relu',\n                input_shape = input_shape) %>% \n  layer_batch_normalization() %>%\n  \n  layer_conv_2d(filters = 32, \n                kernel_size = c(3,3), kernel_initializer = 'he_normal',\n                kernel_regularizer = 'l2',\n                input_shape = input_shape) %>% \n  layer_batch_normalization() %>%\n  \n  layer_conv_2d(filters = 64, kernel_size = c(3,3), activation = 'relu') %>% \n  layer_max_pooling_2d(pool_size = c(2, 2)) %>% \n  layer_dropout(rate = 0.25) %>%\n  \n  layer_conv_2d(filters = 64, kernel_size = c(3,3), activation = 'relu') %>% \n  layer_max_pooling_2d(pool_size = c(2, 2)) %>% \n  layer_dropout(rate = 0.5) %>%\n  \n  layer_flatten() %>% \n  \n  layer_dense(units = 128, activation = 'relu') %>% \n  layer_dropout(rate = 0.5) %>% \n  \n  layer_dense(units = num_classes, activation = 'softmax')\n\nprint(model)","metadata":{"execution":{"iopub.status.busy":"2022-02-03T17:53:29.943026Z","iopub.execute_input":"2022-02-03T17:53:29.944642Z","iopub.status.idle":"2022-02-03T17:53:32.272323Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Compile model","metadata":{}},{"cell_type":"code","source":"model %>% compile(\n  loss = loss_categorical_crossentropy,\n  optimizer = optimizer_adadelta(),\n  metrics = c('accuracy')\n)\n","metadata":{"execution":{"iopub.status.busy":"2022-02-03T17:53:38.166306Z","iopub.execute_input":"2022-02-03T17:53:38.168048Z","iopub.status.idle":"2022-02-03T17:53:38.196567Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Train model","metadata":{}},{"cell_type":"code","source":"history <- model %>% fit(\n    x_train, y_train,\n    batch_size = batch_size,\n    epochs = epochs,\n    verbose = 1,\n    validation_data = list(x_val, y_val)\n)","metadata":{"execution":{"iopub.status.busy":"2022-02-03T17:53:41.917053Z","iopub.execute_input":"2022-02-03T17:53:41.918623Z","iopub.status.idle":"2022-02-03T17:54:14.817616Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plot(history)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Evaluate model ","metadata":{}},{"cell_type":"code","source":"scores <- model %>% evaluate(x_val, y_val, verbose = 0)\n\n# Output metrics\ncat('Test loss:', scores[[1]], '\\n') \ncat('Test accuracy:', scores[[2]], '\\n')","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Predict on test data","metadata":{}},{"cell_type":"code","source":"preds <- model %>% predict_classes(x_test)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Load submission file","metadata":{}},{"cell_type":"code","source":"submission <- read_csv('../input/Kannada-MNIST/sample_submission.csv')","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission$label <- as.vector(preds)\nhead(submission)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Save submission","metadata":{}},{"cell_type":"code","source":"write_csv(submission, 'submission.csv')","metadata":{},"execution_count":null,"outputs":[]}]}