rm(list=ls())
library(keras)
train<-read.csv("../input/train.csv")
test<-read.csv("../input/test.csv")
x_train<-data.matrix(train[,2:785])
x_test<-data.matrix(test[,1:784])
y_train<-data.matrix(train[,1])
#reshape
x_train <- array_reshape(x_train, c(42000,28,28,1))
x_test <- array_reshape(x_test,  c(28000,28,28,1))
# rescale
x_train <- x_train / 255
x_test <- x_test / 255
plot(as.raster(x_train[5,,,]))
plot(as.raster(x_test[5,,,]))
y_train <- to_categorical(y_train, 10)

build.model<- function(){
  model <- keras_model_sequential()   %>% 
    layer_conv_2d(filters = 512, kernel_size = c(3, 3), activation = "relu", input_shape = c(28, 28, 1)) %>%
    layer_max_pooling_2d(pool_size = c(2, 2)) %>%
    layer_conv_2d(filters = 512, kernel_size = c(3, 3), activation = "relu") %>%
    layer_dropout(rate=0.6) %>%
    layer_conv_2d(filters = 256, kernel_size = c(3, 3), activation = "relu") %>%
    layer_dropout(rate=0.4) %>%
    layer_conv_2d(filters = 128, kernel_size = c(3, 3), activation = "relu") %>%
    layer_max_pooling_2d(pool_size = c(2, 2)) %>%
    layer_conv_2d(filters = 64, kernel_size = c(3, 3), activation = "relu")
  model <-model %>%
    layer_flatten() %>%
    layer_dense(units = 64, activation = "relu") %>%
    layer_dense(units = 10, activation = "softmax")
  model %>% compile(
    loss = 'categorical_crossentropy',
    optimizer = "rmsprop",
    metrics = c('accuracy')
  )
}
model<-build.model()
history <- model %>% fit(
  x_train, y_train, 
  epochs = 31, batch_size = 2048, 
  validation_split = 0.2
)
plot(history)
history$metrics$val_acc
pred<-model %>% predict_classes(x_test)
head(pred)
plot(as.raster(x_test[2,,,]))
sub<-data.frame(ImageId=1:28000,Label=pred)
head(sub)
write.csv( sub , file = 'digits_my_solution.csv' , row.names = FALSE )
