library(keras)
library(tidyverse) # metapackage of all tidyverse packages
library(readr)
list.files(path = "../input")
# Baixar base de dados do MNIST
train <- read_csv("../input/digit-recognizer/train.csv")
test <- read_csv("../input/digit-recognizer/test.csv")


#convolução
img_rows <- 28
img_cols <- 28
x_train <- array_reshape(as.matrix(train[,-1]) / 255, c(nrow(train), 28, 28, 1))
x_test <- array_reshape(as.matrix(test) / 255, c(nrow(test), 28, 28, 1))
y_train <- to_categorical(train$label)


# 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 = 1240)


### Construção de uma Rede Neural 

# Parâmetros da rede

batch_size <- 128
num_classes <- 10
epochs <- 12
input_shape <- c(img_rows, img_cols, 1)

## Construção do modelo usando Keras

## Construção do modelo usando Keras

cnn_model <- keras_model_sequential() %>% 

    layer_conv_2d(filters = 32, kernel_size  = c(3,3), activation = 'relu', input_shape = input_shape) %>%  
    layer_max_pooling_2d(pool_size = c(2,2))  %>%
    layer_conv_2d(filters = 64, kernel_size  = c(3,3), activation = 'relu') %>%  
    layer_max_pooling_2d(pool_size = c(2,2))  %>%
    layer_dropout(rate = 0.25) %>% 
    layer_flatten() %>% 
    layer_dense(units = 128, activation = 'relu') %>% 
    layer_dropout(rate = .5) %>%
    layer_dense(units = num_classes, activation = "softmax")

# Resumo do modelo


# Compila 

cnn_model %>% compile(
  loss = loss_categorical_crossentropy,
  optimizer = optimizer_adadelta(),
  metrics = c("accuracy")
)
summary(cnn_model)

# Treinamento e avaliação

cnn_history <-  cnn_model %>% fit(
  x_train, y_train,
  epochs = 10,
  batch_size = 256,
  validation_split = 0.2
)

cnn_model %>% evaluate(x_train, y_train)

###
plot(cnn_history)


cnn_pred <- cnn_model %>% predict_classes(x_test)
head(cnn_pred)
submission <- read_csv("../input/digit-recognizer/sample_submission.csv")
submission$label <- cnn_pred


