vignettes/hyperparameter-tune-with-keras/cifar10_cnn.R

#' Modified from: "https://github.com/rstudio/keras/blob/master/vignettes/
#' examples/cifar10_cnn.R"
#' 
#' Train a simple deep CNN on the CIFAR10 small images dataset.
#'  
#' It gets down to 0.65 test logloss in 25 epochs, and down to 0.55 after 50
#' epochs, though it is still underfitting at that point.

library(keras)

library(azuremlsdk)

# Parameters --------------------------------------------------------------

args <- commandArgs(trailingOnly = TRUE)

batch_size <- as.numeric(args[2])
log_metric_to_run("batch_size", batch_size)

epochs <- as.numeric(args[4])
log_metric_to_run("epochs", epochs)

lr <- as.numeric(args[6])
log_metric_to_run("lr", lr)

decay <- as.numeric(args[8])
log_metric_to_run("decay", decay)

data_augmentation <- TRUE


# Data Preparation --------------------------------------------------------

# See ?dataset_cifar10 for more info
cifar10 <- dataset_cifar10()

# Feature scale RGB values in test and train inputs  
x_train <- cifar10$train$x/255
x_test <- cifar10$test$x/255
y_train <- to_categorical(cifar10$train$y, num_classes = 10)
y_test <- to_categorical(cifar10$test$y, num_classes = 10)


# Defining Model ----------------------------------------------------------

# Initialize sequential model
model <- keras_model_sequential()

model %>%
  
  # Start with hidden 2D convolutional layer being fed 32x32 pixel images
  layer_conv_2d(
    filter = 32, kernel_size = c(3,3), padding = "same", 
    input_shape = c(32, 32, 3)
  ) %>%
  layer_activation("relu") %>%
  
  # Second hidden layer
  layer_conv_2d(filter = 32, kernel_size = c(3, 3)) %>%
  layer_activation("relu") %>%
  
  # Use max pooling
  layer_max_pooling_2d(pool_size = c(2, 2)) %>%
  layer_dropout(0.25) %>%
  
  # 2 additional hidden 2D convolutional layers
  layer_conv_2d(filter = 32, kernel_size = c(3, 3), padding = "same") %>%
  layer_activation("relu") %>%
  layer_conv_2d(filter = 32, kernel_size = c(3, 3)) %>%
  layer_activation("relu") %>%
  
  # Use max pooling once more
  layer_max_pooling_2d(pool_size = c(2, 2)) %>%
  layer_dropout(0.25) %>%
  
  # Flatten max filtered output into feature vector 
  # and feed into dense layer
  layer_flatten() %>%
  layer_dense(512) %>%
  layer_activation("relu") %>%
  layer_dropout(0.5) %>%
  
  # Outputs from dense layer are projected onto 10 unit output layer
  layer_dense(10) %>%
  layer_activation("softmax")

opt <- optimizer_rmsprop(lr, decay)

model %>% 
  compile(loss = "categorical_crossentropy",
          optimizer = opt,
          metrics = "accuracy"
  )


# Training ----------------------------------------------------------------

if (!data_augmentation){
  
  model %>%
    fit(x_train,
        y_train,
        batch_size = batch_size,
        epochs = epochs,
        validation_data = list(x_test, y_test),
        shuffle = TRUE
    )
  
} else {
  
  datagen <- image_data_generator(rotation_range = 20,
                                  width_shift_range = 0.2,
                                  height_shift_range = 0.2,
                                  horizontal_flip = TRUE
  )
  
  datagen %>% fit_image_data_generator(x_train)
  
  results <- evaluate(model, x_train, y_train, batch_size)
  log_metric_to_run("Loss", results[[1]])
  cat("Loss: ", results[[1]], "\n")
  cat("Accuracy: ", results[[2]], "\n")
}

Try the azuremlsdk package in your browser

Any scripts or data that you put into this service are public.

azuremlsdk documentation built on Oct. 23, 2020, 8:22 p.m.