## ----setup, include=FALSE-----------------------------------------------------
library(keras)
knitr::opts_chunk$set(eval = FALSE)

## -----------------------------------------------------------------------------
#  library(keras)
#  
#  model <- keras_model_sequential()
#  model %>%
#    layer_dense(units = 32, input_shape = c(784)) %>%
#    layer_activation('relu') %>%
#    layer_dense(units = 10) %>%
#    layer_activation('softmax')

## -----------------------------------------------------------------------------
#  summary(model)

## -----------------------------------------------------------------------------
#  # For a multi-class classification problem
#  model <- keras_model_sequential()
#  model %>%
#    layer_dense(units = 32, input_shape = c(784)) %>%
#    layer_activation('relu') %>%
#    layer_dense(units = 10) %>%
#    layer_activation('softmax')
#  
#  model %>% compile(
#    optimizer = 'rmsprop',
#    loss = 'categorical_crossentropy',
#    metrics = c('accuracy')
#  )

## -----------------------------------------------------------------------------
#  model %>% compile(
#    optimizer = optimizer_rmsprop(lr = 0.002),
#    loss = 'mse'
#  )

## -----------------------------------------------------------------------------
#  model %>% compile(
#    optimizer = optimizer_rmsprop(),
#    loss = loss_binary_crossentropy,
#    metrics = metric_binary_accuracy
#  )

## -----------------------------------------------------------------------------
#  # create metric using backend tensor functions
#  metric_mean_pred <- custom_metric("mean_pred", function(y_true, y_pred) {
#    k_mean(y_pred)
#  })
#  
#  model %>% compile(
#    optimizer = optimizer_rmsprop(),
#    loss = loss_binary_crossentropy,
#    metrics = c('accuracy', metric_mean_pred)
#  )

## -----------------------------------------------------------------------------
#  # create model
#  model <- keras_model_sequential()
#  
#  # add layers and compile the model
#  model %>%
#    layer_dense(units = 32, activation = 'relu', input_shape = c(100)) %>%
#    layer_dense(units = 1, activation = 'sigmoid') %>%
#    compile(
#      optimizer = 'rmsprop',
#      loss = 'binary_crossentropy',
#      metrics = c('accuracy')
#    )
#  
#  # Generate dummy data
#  data <- matrix(runif(1000*100), nrow = 1000, ncol = 100)
#  labels <- matrix(round(runif(1000, min = 0, max = 1)), nrow = 1000, ncol = 1)
#  
#  # Train the model, iterating on the data in batches of 32 samples
#  model %>% fit(data, labels, epochs=10, batch_size=32)

## -----------------------------------------------------------------------------
#  # create model
#  model <- keras_model_sequential()
#  
#  # define and compile the model
#  model %>%
#    layer_dense(units = 32, activation = 'relu', input_shape = c(100)) %>%
#    layer_dense(units = 10, activation = 'softmax') %>%
#    compile(
#      optimizer = 'rmsprop',
#      loss = 'categorical_crossentropy',
#      metrics = c('accuracy')
#    )
#  
#  # Generate dummy data
#  data <- matrix(runif(1000*100), nrow = 1000, ncol = 100)
#  labels <- matrix(round(runif(1000, min = 0, max = 9)), nrow = 1000, ncol = 1)
#  
#  # Convert labels to categorical one-hot encoding
#  one_hot_labels <- to_categorical(labels, num_classes = 10)
#  
#  # Train the model, iterating on the data in batches of 32 samples
#  model %>% fit(data, one_hot_labels, epochs=10, batch_size=32)

## -----------------------------------------------------------------------------
#  library(keras)
#  
#  # generate dummy data
#  x_train <- matrix(runif(1000*20), nrow = 1000, ncol = 20)
#  
#  y_train <- runif(1000, min = 0, max = 9) %>%
#    round() %>%
#    matrix(nrow = 1000, ncol = 1) %>%
#    to_categorical(num_classes = 10)
#  
#  x_test  <- matrix(runif(100*20), nrow = 100, ncol = 20)
#  
#  y_test <- runif(100, min = 0, max = 9) %>%
#    round() %>%
#    matrix(nrow = 100, ncol = 1) %>%
#    to_categorical(num_classes = 10)
#  
#  # create model
#  model <- keras_model_sequential()
#  
#  # define and compile the model
#  model %>%
#    layer_dense(units = 64, activation = 'relu', input_shape = c(20)) %>%
#    layer_dropout(rate = 0.5) %>%
#    layer_dense(units = 64, activation = 'relu') %>%
#    layer_dropout(rate = 0.5) %>%
#    layer_dense(units = 10, activation = 'softmax') %>%
#    compile(
#      loss = 'categorical_crossentropy',
#      optimizer = optimizer_sgd(lr = 0.01, decay = 1e-6, momentum = 0.9, nesterov = TRUE),
#      metrics = c('accuracy')
#    )
#  
#  # train
#  model %>% fit(x_train, y_train, epochs = 20, batch_size = 128)
#  
#  # evaluate
#  score <- model %>% evaluate(x_test, y_test, batch_size = 128)

## -----------------------------------------------------------------------------
#  library(keras)
#  
#  # generate dummy data
#  x_train <- matrix(runif(1000*20), nrow = 1000, ncol = 20)
#  y_train <- matrix(round(runif(1000, min = 0, max = 1)), nrow = 1000, ncol = 1)
#  x_test <- matrix(runif(100*20), nrow = 100, ncol = 20)
#  y_test <- matrix(round(runif(100, min = 0, max = 1)), nrow = 100, ncol = 1)
#  
#  # create model
#  model <- keras_model_sequential()
#  
#  # define and compile the model
#  model %>%
#    layer_dense(units = 64, activation = 'relu', input_shape = c(20)) %>%
#    layer_dropout(rate = 0.5) %>%
#    layer_dense(units = 64, activation = 'relu') %>%
#    layer_dropout(rate = 0.5) %>%
#    layer_dense(units = 1, activation = 'sigmoid') %>%
#    compile(
#      loss = 'binary_crossentropy',
#      optimizer = 'rmsprop',
#      metrics = c('accuracy')
#    )
#  
#  # train
#  model %>% fit(x_train, y_train, epochs = 20, batch_size = 128)
#  
#  # evaluate
#  score = model %>% evaluate(x_test, y_test, batch_size=128)

## -----------------------------------------------------------------------------
#  library(keras)
#  
#  # generate dummy data
#  x_train <- array(runif(100 * 100 * 100 * 3), dim = c(100, 100, 100, 3))
#  
#  y_train <- runif(100, min = 0, max = 9) %>%
#    round() %>%
#    matrix(nrow = 100, ncol = 1) %>%
#    to_categorical(num_classes = 10)
#  
#  x_test <- array(runif(20 * 100 * 100 * 3), dim = c(20, 100, 100, 3))
#  
#  y_test <- runif(20, min = 0, max = 9) %>%
#    round() %>%
#    matrix(nrow = 20, ncol = 1) %>%
#    to_categorical(num_classes = 10)
#  
#  # create model
#  model <- keras_model_sequential()
#  
#  # define and compile model
#  # input: 100x100 images with 3 channels -> (100, 100, 3) tensors.
#  # this applies 32 convolution filters of size 3x3 each.
#  model %>%
#    layer_conv_2d(filters = 32, kernel_size = c(3,3), activation = 'relu',
#                  input_shape = c(100,100,3)) %>%
#    layer_conv_2d(filters = 32, kernel_size = c(3,3), activation = 'relu') %>%
#    layer_max_pooling_2d(pool_size = c(2,2)) %>%
#    layer_dropout(rate = 0.25) %>%
#    layer_conv_2d(filters = 64, kernel_size = c(3,3), activation = 'relu') %>%
#    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 = 256, activation = 'relu') %>%
#    layer_dropout(rate = 0.25) %>%
#    layer_dense(units = 10, activation = 'softmax') %>%
#    compile(
#      loss = 'categorical_crossentropy',
#      optimizer = optimizer_sgd(lr = 0.01, decay = 1e-6, momentum = 0.9, nesterov = TRUE)
#    )
#  
#  # train
#  model %>% fit(x_train, y_train, batch_size = 32, epochs = 10)
#  
#  # evaluate
#  score <- model %>% evaluate(x_test, y_test, batch_size = 32)

## ---- eval = FALSE------------------------------------------------------------
#  model <- keras_model_sequential()
#  model %>%
#    layer_embedding(input_dim = max_features, output_dim - 256) %>%
#    layer_lstm(units = 128) %>%
#    layer_dropout(rate = 0.5) %>%
#    layer_dense(units = 1, activation = 'sigmoid') %>%
#    compile(
#      loss = 'binary_crossentropy',
#      optimizer = 'rmsprop',
#      metrics = c('accuracy')
#    )
#  
#  model %>% fit(x_train, y_train, batch_size = 16, epochs = 10)
#  score <- model %>% evaluate(x_test, y_test, batch_size = 16)

## ---- eval=FALSE--------------------------------------------------------------
#  model <- keras_model_sequential()
#  model %>%
#    layer_conv_1d(filters = 64, kernel_size = 3, activation = 'relu',
#                  input_shape = c(seq_length, 100)) %>%
#    layer_conv_1d(filters = 64, kernel_size = 3, activation = 'relu') %>%
#    layer_max_pooling_1d(pool_size = 3) %>%
#    layer_conv_1d(filters = 128, kernel_size = 3, activation = 'relu') %>%
#    layer_conv_1d(filters = 128, kernel_size = 3, activation = 'relu') %>%
#    layer_global_average_pooling_1d() %>%
#    layer_dropout(rate = 0.5) %>%
#    layer_dense(units = 1, activation = 'sigmoid') %>%
#    compile(
#      loss = 'binary_crossentropy',
#      optimizer = 'rmsprop',
#      metrics = c('accuracy')
#    )
#  
#  model %>% fit(x_train, y_train, batch_size = 16, epochs = 10)
#  score <- model %>% evaluate(x_test, y_test, batch_size = 16)

## -----------------------------------------------------------------------------
#  library(keras)
#  
#  # constants
#  data_dim <- 16
#  timesteps <- 8
#  num_classes <- 10
#  
#  # define and compile model
#  # expected input data shape: (batch_size, timesteps, data_dim)
#  model <- keras_model_sequential()
#  model %>%
#    layer_lstm(units = 32, return_sequences = TRUE, input_shape = c(timesteps, data_dim)) %>%
#    layer_lstm(units = 32, return_sequences = TRUE) %>%
#    layer_lstm(units = 32) %>% # return a single vector dimension 32
#    layer_dense(units = 10, activation = 'softmax') %>%
#    compile(
#      loss = 'categorical_crossentropy',
#      optimizer = 'rmsprop',
#      metrics = c('accuracy')
#    )
#  
#  # generate dummy training data
#  x_train <- array(runif(1000 * timesteps * data_dim), dim = c(1000, timesteps, data_dim))
#  y_train <- matrix(runif(1000 * num_classes), nrow = 1000, ncol = num_classes)
#  
#  # generate dummy validation data
#  x_val <- array(runif(100 * timesteps * data_dim), dim = c(100, timesteps, data_dim))
#  y_val <- matrix(runif(100 * num_classes), nrow = 100, ncol = num_classes)
#  
#  # train
#  model %>% fit(
#    x_train, y_train, batch_size = 64, epochs = 5, validation_data = list(x_val, y_val)
#  )

## -----------------------------------------------------------------------------
#  library(keras)
#  
#  # constants
#  data_dim <- 16
#  timesteps <- 8
#  num_classes <- 10
#  batch_size <- 32
#  
#  # define and compile model
#  # Expected input batch shape: (batch_size, timesteps, data_dim)
#  # Note that we have to provide the full batch_input_shape since the network is stateful.
#  # the sample of index i in batch k is the follow-up for the sample i in batch k-1.
#  model <- keras_model_sequential()
#  model %>%
#    layer_lstm(units = 32, return_sequences = TRUE, stateful = TRUE,
#               batch_input_shape = c(batch_size, timesteps, data_dim)) %>%
#    layer_lstm(units = 32, return_sequences = TRUE, stateful = TRUE) %>%
#    layer_lstm(units = 32, stateful = TRUE) %>%
#    layer_dense(units = 10, activation = 'softmax') %>%
#    compile(
#      loss = 'categorical_crossentropy',
#      optimizer = 'rmsprop',
#      metrics = c('accuracy')
#    )
#  
#  # generate dummy training data
#  x_train <- array(runif( (batch_size * 10) * timesteps * data_dim),
#                   dim = c(batch_size * 10, timesteps, data_dim))
#  y_train <- matrix(runif( (batch_size * 10) * num_classes),
#                    nrow = batch_size * 10, ncol = num_classes)
#  
#  # generate dummy validation data
#  x_val <- array(runif( (batch_size * 3) * timesteps * data_dim),
#                 dim = c(batch_size * 3, timesteps, data_dim))
#  y_val <- matrix(runif( (batch_size * 3) * num_classes),
#                  nrow = batch_size * 3, ncol = num_classes)
#  
#  # train
#  model %>% fit(
#    x_train,
#    y_train,
#    batch_size = batch_size,
#    epochs = 5,
#    shuffle = FALSE,
#    validation_data = list(x_val, y_val)
#  )

