{"cells":[{"metadata":{"_uuid":"39fcd29a1d495d6e92253d8d059b207c023ad822"},"cell_type":"markdown","source":"# Predicting Distracted Driver Types with Keras in R"},{"metadata":{"_uuid":"fe6ccd9d08369b525a827e495f82ca91f11ca486"},"cell_type":"markdown","source":"## Prep"},{"metadata":{"_uuid":"3c94b662ea1d399194abeff10b369769c068189b"},"cell_type":"markdown","source":"#### Load Libraries"},{"metadata":{"_uuid":"a3ebc69aebfed3d8d116352e3954752cec5fd163","_execution_state":"idle","_cell_guid":"a312d0f0-1ad0-4b44-a720-cca1977d941d","trusted":true},"cell_type":"code","source":"\n#library(devtools)\nlibrary(tidyverse)\nlibrary(keras)\nlibrary(magick)\n","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"fea0d5303dc2a10e12a3c2e449d8abd8217c8252"},"cell_type":"markdown","source":"#### List Files"},{"metadata":{"trusted":true,"_uuid":"21f529842e0c7e0e17334bdc8e6f5132325eb5c3"},"cell_type":"code","source":"list.files(\"../input\")\n\nlist.files('../input/train')\n\nhead(list.files('../input/test'))\n\nhead(read.csv('../input/sample_submission.csv'))\n\nhead(read.csv('../input/driver_imgs_list.csv'))\n","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"19dafff84d197dd5ab06dd47e8a17ea53bef81fe"},"cell_type":"markdown","source":"## Image Data Generators"},{"metadata":{"trusted":true,"_uuid":"1fee59cbe0d1bc46fe8104e7a386efb0b0e8a72a"},"cell_type":"code","source":"## Build Generators\n\ntrain_dir <- \"../input/train\"\ntest_dir <- '../input/test'\n\ntrain_datagen = image_data_generator(rescale = 1/255, data_format='channels_last', validation_split=.5)\ntest_datagen <- image_data_generator(rescale = 1/255, data_format='channels_last')  \n\ntrain_generator <- flow_images_from_directory(\n  train_dir,                  # Target directory  \n  train_datagen,              # Data generator\n  target_size = c(256, 256),  # Resizes all images\n  batch_size = 4,\n  class_mode = \"categorical\",       \n  subset='training'\n)\n\nvalidation_generator <- flow_images_from_directory(\n  train_dir,                  # Target directory  \n  train_datagen,              # Data generator\n  target_size = c(256, 256),  # Resizes all images\n  batch_size = 4,\n  class_mode = \"categorical\",       \n  subset='validation'\n)\n\ntest_generator <- flow_images_from_directory(\n  test_dir,                  # Target directory  \n  test_datagen,              # Data generator\n  target_size = c(256, 256),  # Resizes all images\n  batch_size = 4,\n  shuffle=FALSE,\n  class_mode = NULL\n)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"1fa16cec4125b108f059e14e80d7076d98a30cea"},"cell_type":"markdown","source":"## Specify Model "},{"metadata":{"trusted":true,"_uuid":"c63af21ba237145d755d3f5e45bef49fbbfeed46"},"cell_type":"code","source":"model <- keras_model_sequential()\n\nmodel %>%\n  \n  # Start with hidden 2D convolutional layer being fed 32x32 pixel images\n  layer_conv_2d(\n    filter = 16, kernel_size = c(2), padding = \"same\", \n    input_shape = c(256, 256, 3),\n      activation='relu') %>%\n  layer_batch_normalization() %>%\n  # Second hidden layer\n  layer_conv_2d(filter = 128, kernel_size = c(2), activation='relu') %>%\n  layer_batch_normalization() %>%    \n\n  # Use max pooling\n  layer_max_pooling_2d(pool_size = c(2)) %>%\n  layer_dropout(rate=.2) %>%\n      \n  # 2 additional hidden 2D convolutional layers\n  layer_conv_2d(filter = 64, kernel_size = c(4), padding = \"same\", activation='relu') %>%\n  layer_batch_normalization() %>%\n  layer_conv_2d(filter = 64, kernel_size = c(4), activation='relu') %>%\n  layer_batch_normalization() %>%\n\n  layer_max_pooling_2d(pool_size = c(2)) %>%\n  layer_dropout(rate=.2) %>%\n\n  layer_conv_2d(filter = 32, kernel_size = c(4), padding = \"same\", activation='relu') %>%\n  layer_batch_normalization() %>%\n  layer_conv_2d(filter = 32, kernel_size = c(4), activation='relu') %>%\n  layer_batch_normalization() %>%\n\n  layer_max_pooling_2d(pool_size = c(2)) %>%\n  layer_dropout(rate=.2) %>%\n\n  layer_conv_2d(filter = 16, kernel_size = c(4), padding = \"same\", activation='relu') %>%\n  layer_batch_normalization() %>%\n  layer_conv_2d(filter = 16, kernel_size = c(4), activation='relu') %>%\n  layer_batch_normalization() %>%\n\n  # Flatten max filtered output into feature vector \n  # and feed into dense layer\n  layer_flatten() %>%\n  layer_dropout(rate=.2) %>%\n\n  #layer_dense(128, activaton='relu') %>% \n  \n  # Outputs from dense layer are projected onto 10 unit output layer\n  layer_dense(10, activation='softmax')\n","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"c12c40472b5fe8445a5dbebe33247fe88b566302"},"cell_type":"markdown","source":"## Explore Model"},{"metadata":{"trusted":true,"scrolled":false,"_uuid":"fee9d244bcc2e9c918d4b533bae605f0ecba2cb5"},"cell_type":"code","source":"str(model)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"90f0281d8337d059658de0118b0b30bc5139729c"},"cell_type":"markdown","source":"## Compile Model"},{"metadata":{"trusted":true,"_uuid":"e0577109215899bafc0e7464efd2c4d81c25ff78"},"cell_type":"code","source":"opt <- optimizer_rmsprop(lr = 0.0001, decay = 1e-6)\n\nmodel %>% compile(\n  loss = \"categorical_crossentropy\",\n  optimizer = opt,\n  metrics = \"accuracy\"\n)\n","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"b8416af3a1c2abdff055bf08b386f038306b2e54"},"cell_type":"markdown","source":"## Fit Model"},{"metadata":{"trusted":true,"_uuid":"e783154b9cc3acbccee588884387790e19201e52"},"cell_type":"code","source":"history <- model %>% fit_generator(\n  train_generator,\n  steps_per_epoch = 600,\n  epochs = 10,\n  validation_data=validation_generator,\n  validation_steps=100\n)\n\nplot(history)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"6470a8676f400379cc339ba08fcc6293f7bb49da"},"cell_type":"markdown","source":"## Explore Model History\n"},{"metadata":{"trusted":true,"_uuid":"504c63744229637419308680727d024e3bee5700"},"cell_type":"code","source":"model %>% evaluate_generator(validation_generator, steps=50)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"4c844a1b7bb0393b7a03dddc6669ca7dd978c9ce"},"cell_type":"markdown","source":"## Predict on Test Set\n\n(Still debugging predict_generator on test data)"},{"metadata":{"trusted":true,"_uuid":"c674d753319561df180dd65d85ff18848a16f981"},"cell_type":"code","source":"#test_generator","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"d60143ada4a171c665f34efd0811d1078d19092a"},"cell_type":"code","source":"#pred_class <- predict_generator(model, test_generator, steps=10, max_queue_size=10, verbose=1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"8d05e6a5905afd63dd99b3a83df6ebb41b347f73"},"cell_type":"markdown","source":"## Scoring a Random Example"},{"metadata":{"trusted":true,"_uuid":"180357bbf2638da1da623e7a10564b229696e85b"},"cell_type":"code","source":"classes <- c('normal driving', 'texting - right', 'talking on the phone - right', 'texting - left',\n             'talking on the phone - left', 'operating the radio', 'drinking', 'reaching behind',\n             'hair and makeup', 'talking to passenger')\n\nfile <- sample(list.files(test_dir),1)\n\nimg_path <- paste(test_dir, file, sep='/')         \nimg <- image_load(img_path, target_size = c(256, 256)) %>%           \n  image_to_array() %>%                                               \n  array_reshape(dim = c(1, 256, 256, 3)) \n\n\np_class <- predict_classes(model, img)\npreds <- as.data.frame(t(predict_proba(model, img)))\npreds$class <- classes\n\n\nclasses[p_class+1]\npreds\n\n\nimg_ <- image_load(img_path, target_size = c(640, 480)) %>%           \n  image_to_array() %>%                                               \n  array_reshape(dim = c(1, 640, 480, 3)) \n\n\nimg_tensor=img_/255\nplot(as.raster(img_tensor[1,,,]))\n","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"b3f18a6ecdbdcb86fa7a06247e23ac56e03bb210"},"cell_type":"markdown","source":"### Save Model"},{"metadata":{"trusted":true,"_uuid":"13ee50fce2890dbdac1093374e39cb949c73b404"},"cell_type":"code","source":"save_model_hdf5(model, 'model_v4.hdf5', overwrite = TRUE,\n  include_optimizer = TRUE)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"83d87dd161c1a7aa8721b3f7fdb38a41d5b71cb3"},"cell_type":"markdown","source":""},{"metadata":{"_uuid":"e032034311b2c7a71932e8746be0fa6e3cac7ee1"},"cell_type":"markdown","source":""}],"metadata":{"language_info":{"mimetype":"text/x-r-source","name":"R","pygments_lexer":"r","version":"3.4.2","file_extension":".r","codemirror_mode":"r"},"kernelspec":{"display_name":"R","language":"R","name":"ir"}},"nbformat":4,"nbformat_minor":1}