# %% [code] {"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2021-12-10T11:11:21.005840Z","iopub.execute_input":"2021-12-10T11:11:21.009161Z"}}
#Carregando pacotes
library(tidyverse)
library(keras)
library(readr)

list.files(path = "../input")

#Lendo a base de dados
train <- read_csv("../input/digit-recognizer/train.csv")
test <- read_csv("../input/digit-recognizer/test.csv")
submission1 <- read_csv("../input/digit-recognizer/sample_submission.csv")
submission2 <- read_csv("../input/digit-recognizer/sample_submission.csv")
submission3 <- read_csv("../input/digit-recognizer/sample_submission.csv")



# Convolução
img_rows <- 28
img_cols <- 28
x_train <- array_reshape(train %>% select(-label) %>% as.matrix, c(nrow(train), img_rows, img_cols, 1))
x_test <- array_reshape(test %>% as.matrix, c(nrow(test), img_rows, img_cols, 1))
y_train <- train %>% select(label) %>% as.matrix %>% to_categorical(num_classes = 10)

# Exemplo de imagens
image_plot <- function(image_index = 1L){
image(x = 1:28, 
        y = 1:28, 
        z = 255  - t(apply(x_train[image_index,,,1], 2L, rev)), 
        col = gray.colors(256))

}

# plotar imagem de índice 3
image_plot(image_index = 1)

#########################################################################
image(t(255 - x_train[1240,,,1]))

# Parâmetros da rede
batch_size <- 128
num_classes <- 10
epochs <- 10

x_train <- x_train/255
x_test <- x_test/255

input_shape <- c(img_rows, img_cols, 1)

## Construção do modelo usando Keras Rede 1
cnn_model1 <- keras_model_sequential() %>% 
    layer_conv_2d(filter = 32, 
                  kernel_size  = c(3,3), 
                  activation = 'relu', 
                  input_shape = input_shape) %>%  
    layer_max_pooling_2d(pool_size = c(2,2))  %>%
    layer_conv_2d(filter = 64, 
                  kernel_size  = c(3,3), 
                  activation = 'relu') %>%  
    layer_max_pooling_2d(pool_size = c(2,2))  %>%
    #layer_dropout(rate = .25) %>%
    layer_flatten()  %>% 
    layer_dense(units = 64, activation = 'relu') %>% 
    layer_dropout(rate = .20) %>% 
    layer_dense(units = 10, activation = 'softmax')

summary(cnn_model1)
# Compilar
cnn_model1 %>% compile(
    loss = loss_categorical_crossentropy,
    optimizer = optimizer_adadelta(),
    metrics = c('accuracy')
)

# Treinamento
cnn_hist1 <- cnn_model1 %>% 
    fit(x_train, 
        y_train, 
        batch_size = 128,
       epochs = 15,
       validation_split = .2)
plot(cnn_hist1)

####
cnn_pred1 <- cnn_model1 %>% predict_classes(x_test)
head(cnn_pred1)
submission1$Label <- cnn_pred1


#Modelo 2
cnn_model2<- keras_model_sequential() %>% 
    layer_conv_2d(filter = 64, 
                  kernel_size  = c(3,3), 
                  activation = 'sigmoid', 
                  input_shape = input_shape) %>%  
    layer_max_pooling_2d(pool_size = c(2,2))  %>%
    layer_conv_2d(filter = 128, 
                  kernel_size  = c(3,3), 
                  activation = 'sigmoid') %>%  
    layer_max_pooling_2d(pool_size = c(2,2))  %>%
    #layer_dropout(rate = .25) %>%
    layer_flatten()  %>% 
    layer_dense(units = 32, activation = 'softmax') %>% 
    layer_dropout(rate = .20) %>% 
    layer_dense(units = 10, activation = 'softmax')

summary(cnn_model2)
# Compilar
cnn_model2 %>% compile(
    loss = loss_categorical_crossentropy,
    optimizer = optimizer_adadelta(),
    metrics = c('accuracy')
)
# Treinamento
cnn_hist2 <- cnn_model2 %>% 
    fit(x_train, 
        y_train, 
        batch_size = 128,
       epochs = 15,
       validation_split = .2)
plot(cnn_hist2)

cnn_pred2 <- cnn_model2 %>% predict_classes(x_test)
head(cnn_pred2)
submission2$Label <- cnn_pred2

#Modelo 3
cnn_model3 <- keras_model_sequential() %>% 
    layer_conv_2d(filter = 128, 
                  kernel_size  = c(3,3), 
                  activation = 'tanh', 
                  input_shape = input_shape) %>%  
    layer_max_pooling_2d(pool_size = c(2,2))  %>%
    layer_conv_2d(filter = 128, 
                  kernel_size  = c(3,3), 
                  activation = 'relu') %>%  
    layer_max_pooling_2d(pool_size = c(2,2))  %>%
    #layer_dropout(rate = .25) %>%
    layer_flatten()  %>% 
    layer_dense(units = 32, activation = 'softmax') %>% 
    layer_dropout(rate = .20) %>% 
    layer_dense(units = 10, activation = 'softmax')

summary(cnn_model3)
# Compilar
cnn_model3 %>% compile(
    loss = loss_categorical_crossentropy,
    optimizer = optimizer_adadelta(),
    metrics = c('accuracy')
)
# Treinamento
cnn_hist3<- cnn_model3 %>% 
    fit(x_train, 
        y_train, 
        batch_size = 128,
       epochs = 15,
       validation_split = .2)
plot(cnn_hist3)

####
cnn_pred3 <- cnn_model3 %>% predict_classes(x_test)
head(cnn_pred3)
submission3$Label <- cnn_pred3


#Criando as submissões
write.csv(submission1, 'submission1.csv', row.names=FALSE)
write.csv(submission2, 'submission2.csv', row.names=FALSE)
write.csv(submission3, 'submission3.csv', row.names=FALSE)

# %% [code]
