{"cells":[{"metadata":{"_uuid":"051d70d956493feee0c6d64651c6a088724dca2a","_execution_state":"idle","trusted":true},"cell_type":"code","source":"library(tidyverse)\nlibrary(keras)\nlibrary(oro.dicom)\nlibrary(scales)\n### https://www.kaggle.com/mrfrancois/setting-up-data-generator-and-cnn-in-r","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train <- read_csv(\"../input/rsna-intracranial-hemorrhage-detection/stage_1_train.csv\")\ntrain <- train %>% distinct() # remove identical rows\ntrain<-train %>% separate(ID,sep=\"_\",remove=FALSE,into=c(NA,\"ID\",\"type\"))\ntrain$ID<-paste0(\"ID_\",train$ID)\ntrain_spread<-spread(train, key=type , value = Label)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Using generator"},{"metadata":{"trusted":true},"cell_type":"code","source":"files<-list.files(\"../input/rsna-intracranial-hemorrhage-detection/stage_1_train_images\")\nfiles<-files[-264486] # remove corrupted file\n\n# create train and validation set\nset.seed(314)\n# index <- sample(1:length(files),floor(0.9*length(files)),replace=FALSE) \nindex <- sample(1:length(files), 500,replace=FALSE) \ntrain_files <- files[index] \n# val_files <- files[-index]\nval_files <- files[sample(setdiff(length(files), index), 100,replace=FALSE)]\n \n# generates random training batches \ngenerator <- function(batch_size, file){\n file_sample <- sample(file, batch_size, replace=FALSE) \n function(){   \n   samples <- array(0, dim=c(batch_size,512,512,1))\n   targets <- array(0, dim=c(batch_size,6))\n   for (i in 1:batch_size){\n     file_name <- file_sample[i]\n     id <- str_remove(file_name,\".dcm\") \n     file_path <- paste0(\"../input/rsna-intracranial-hemorrhage-detection/stage_1_train_images/\", file_name)  \n     pixel_matrix <- readDICOMFile(file_path)[[2]] \n     scaled_pixel_matrix <- rescale(matrix(pixel_matrix,ncol=1),range=c(-1,1))\n     samples[i,,,] <- array(scaled_pixel_matrix, dim=c(512,512,1)) \n     target_row <- train_spread %>% dplyr::filter(ID==id)\n     targets[i,] <- as.numeric(target_row[1,2:7])  \n     }\n   list(samples, array(targets, dim=c(batch_size, 6)))\n }     \n}\n\ntrain_generator <- generator(batch_size=32, file=train_files) \nval_generator <- generator(batch_size=32, file=val_files)\n\nlength(train_files)\nlength(val_files)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# simple cnn to get going"},{"metadata":{"trusted":true},"cell_type":"code","source":"# sample model\n\nmodel <- keras_model_sequential() %>% \n  layer_conv_2d(filters = 128, kernel_size = c(3, 3), activation = \"relu\",\n                 input_shape = c(512, 512,1)) %>%  \n  layer_batch_normalization()  %>% \n  layer_max_pooling_2d(pool_size = c(2, 2)) %>% \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_flatten() %>% \n  layer_dense(units = 6, activation = \"sigmoid\")\n\nmodel %>% compile(\n  loss = \"categorical_crossentropy\",\n  optimizer = optimizer_rmsprop(lr = 1e-3)\n)\n\nmodel %>% fit_generator(\n   generator=train_generator,\n   steps_per_epoch = 5,\n   epochs = 2,\n   validation_data = val_generator,\n   validation_steps = 3\n )\n\nmodel","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# generator for test"},{"metadata":{"trusted":true},"cell_type":"code","source":"test_files<-list.files(\"../input/rsna-intracranial-hemorrhage-detection/stage_1_test_images\")\n\ntest_generator_fx <- function(interval, batch_size, file){\n set.seed(314)  \n a <- (1+interval*batch_size)\n b <- ifelse(batch_size+(interval*batch_size) > length(test_files), length(test_files), batch_size+(interval*batch_size))\n    \n file_sample <- test_files[a:b]\n   samples <- array(0, dim=c((b-a+1),512,512,1))\n   for (i in 1:(b-a+1)){\n     file_name <- file_sample[i]\n     id <- str_remove(file_name,\".dcm\") \n     file_path <- paste0(\"../input/rsna-intracranial-hemorrhage-detection/stage_1_test_images/\", file_name)  \n     pixel_matrix <- readDICOMFile(file_path)[[2]] \n     scaled_pixel_matrix <- rescale(matrix(pixel_matrix,ncol=1),range=c(-1,1))\n     samples[i,,,] <- array(scaled_pixel_matrix, dim=c(512,512,1)) \n     }\n   return(samples)\n}\nlength(test_files)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"my_preds_list <- list()\n\nfor (i in 0:floor(length(test_files)/100)){\n    my_preds_list[[i+1]] <- model %>% \n    predict_on_batch(test_generator_fx(interval = i, batch_size = 100, file = test_files)) %>% \n    as.data.frame()\n}","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"my_preds <- do.call(rbind, my_preds_list) %>% as.data.frame()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# process predictions"},{"metadata":{"trusted":true},"cell_type":"code","source":"process_test <- function(k){\n    my_names <- paste(strsplit(test_files[k], \".\", fixed=T)[[1]][1], c('epidural',\n                                                                        'intraparenchymal',\n                                                                        'intraventricular',\n                                                                        'subarachnoid',\n                                                                        'subdural',\n                                                                        'any'), sep='_')\n    return(my_names)\n}","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"data.frame(ID=lapply(1:nrow(my_preds), function(j) process_test(j)) %>% do.call('c', .), \n           Label = my_preds %>% as.matrix %>% t() %>% as.numeric()\n                     ) %>% \nwrite_csv('my_preds.csv')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"R","language":"R","name":"ir"},"language_info":{"mimetype":"text/x-r-source","name":"R","pygments_lexer":"r","version":"3.4.2","file_extension":".r","codemirror_mode":"r"}},"nbformat":4,"nbformat_minor":1}