#' Function to build the DeepMedic Network from scratch so it can be customized
#'
#' @param model_params all 3 spatial dimensions of input shape must be even; must
#' also specify downsamp factor for downsampled pathway and kernel size of conv layers
#' Input size is contextual input size (largest patch before downsampling)
#'
#' @return
#' @export
#'
#' @examples
build_DeepMedic <- function(model_params){
high_res_path_image_size <- c(((model_params$input_shape[1:2]/model_params$d_factor - 16)*model_params$d_factor+16),model_params$input_shape[3],1)
low_res_path_image_size <- c((model_params$input_shape[1:2]/3), model_params$input_shape[3],1)
input_path_1 <- keras::layer_input(shape=high_res_path_image_size, name="input_path_1")
# input_shape_2 <- c((model_params$input_shape[1:3]%/%2+8), model_params$input_shape[4])
# input_shape_2 <- c((model_params$input_shape[1:2]%/%2+
# (model_params$kernel_size-1)*model_params$downsamp_factor),
# model_params$input_shape[3]%/%model_params$downsamp_factor,
# model_params$input_shape[4])
# for(d in 1:length(input_shape_2[1:3])){
# if(input_shape_2[d] %% 2 != 0){
# input_shape_2[d] <- input_shape_2[d] - 1
# }
# }
input_path_2 <- keras::layer_input(shape=low_res_path_image_size, name="input_path_2")
path_1 <- input_path_1 %>%
keras::layer_conv_3d(filters = 30, kernel_size = c(3,3,1),
kernel_initializer = keras::initializer_he_normal(),
kernel_regularizer = keras::regularizer_l1_l2(l1=0.00001, l2=0.0001),
name = "path_1_conv_1") %>%
keras::layer_activation_parametric_relu() %>%
keras::layer_batch_normalization() %>%
keras::layer_spatial_dropout_3d(rate=0.02) %>%
keras::layer_conv_3d(filters = 30, kernel_size = c(3,3,1),
kernel_initializer = keras::initializer_he_normal(),
kernel_regularizer = keras::regularizer_l1_l2(l1=0.00001, l2=0.0001),
name = "path_1_conv_2") %>%
keras::layer_activation_parametric_relu() %>%
keras::layer_batch_normalization() %>%
keras::layer_spatial_dropout_3d(rate=0.02) %>%
keras::layer_conv_3d(filters = 40, kernel_size = c(3,3,1),
kernel_initializer = keras::initializer_he_normal(),
kernel_regularizer = keras::regularizer_l1_l2(l1=0.00001, l2=0.0001),
name = "path_1_conv_3") %>%
keras::layer_activation_parametric_relu() %>%
keras::layer_batch_normalization() %>%
keras::layer_spatial_dropout_3d(rate=0.02) %>%
keras::layer_conv_3d(filters = 40, kernel_size = c(3,3,1),
kernel_initializer = keras::initializer_he_normal(),
kernel_regularizer = keras::regularizer_l1_l2(l1=0.00001, l2=0.0001),
name = "path_1_conv_4") %>%
keras::layer_activation_parametric_relu() %>%
keras::layer_batch_normalization() %>%
keras::layer_spatial_dropout_3d(rate=0.02) %>%
keras::layer_conv_3d(filters = 40, kernel_size = c(3,3,1),
kernel_initializer = keras::initializer_he_normal(),
kernel_regularizer = keras::regularizer_l1_l2(l1=0.00001, l2=0.0001),
name = "path_1_conv_5") %>%
keras::layer_activation_parametric_relu() %>%
keras::layer_batch_normalization() %>%
keras::layer_spatial_dropout_3d(rate=0.02) %>%
keras::layer_conv_3d(filters = 40, kernel_size = c(3,3,1),
kernel_initializer = keras::initializer_he_normal(),
kernel_regularizer = keras::regularizer_l1_l2(l1=0.00001, l2=0.0001),
name = "path_1_conv_6") %>%
keras::layer_activation_parametric_relu() %>%
keras::layer_batch_normalization() %>%
keras::layer_spatial_dropout_3d(rate=0.02) %>%
keras::layer_conv_3d(filters = 50, kernel_size = c(3,3,1),
kernel_initializer = keras::initializer_he_normal(),
kernel_regularizer = keras::regularizer_l1_l2(l1=0.00001, l2=0.0001),
name = "path_1_conv_7") %>%
keras::layer_activation_parametric_relu() %>%
keras::layer_batch_normalization() %>%
keras::layer_spatial_dropout_3d(rate=0.02) %>%
keras::layer_conv_3d(filters = 50, kernel_size = c(3,3,1),
kernel_initializer = keras::initializer_he_normal(),
kernel_regularizer = keras::regularizer_l1_l2(l1=0.00001, l2=0.0001),
name = "path_1_conv_8") %>%
keras::layer_activation_parametric_relu() %>%
keras::layer_batch_normalization() %>%
keras::layer_spatial_dropout_3d(rate=0.02)
path_2 <- input_path_2 %>%
keras::layer_conv_3d(filters = 30, kernel_size = c(3,3,1),
kernel_initializer = keras::initializer_he_normal(),
kernel_regularizer = keras::regularizer_l1_l2(l1=0.00001, l2=0.0001),
name = "path_2_conv_1") %>%
keras::layer_activation_parametric_relu() %>%
keras::layer_batch_normalization() %>%
keras::layer_spatial_dropout_3d(rate=0.02) %>%
keras::layer_conv_3d(filters = 30, kernel_size = c(3,3,1),
kernel_initializer = keras::initializer_he_normal(),
kernel_regularizer = keras::regularizer_l1_l2(l1=0.00001, l2=0.0001),
name = "path_2_conv_2") %>%
keras::layer_activation_parametric_relu() %>%
keras::layer_batch_normalization() %>%
keras::layer_spatial_dropout_3d(rate=0.02) %>%
keras::layer_conv_3d(filters = 40, kernel_size = c(3,3,1),
kernel_initializer = keras::initializer_he_normal(),
kernel_regularizer = keras::regularizer_l1_l2(l1=0.00001, l2=0.0001),
name = "path_2_conv_3") %>%
keras::layer_activation_parametric_relu() %>%
keras::layer_batch_normalization() %>%
keras::layer_spatial_dropout_3d(rate=0.02) %>%
keras::layer_conv_3d(filters = 40, kernel_size = c(3,3,1),
kernel_initializer = keras::initializer_he_normal(),
kernel_regularizer = keras::regularizer_l1_l2(l1=0.00001, l2=0.0001),
name = "path_2_conv_4") %>%
keras::layer_activation_parametric_relu() %>%
keras::layer_batch_normalization() %>%
keras::layer_spatial_dropout_3d(rate=0.02) %>%
keras::layer_conv_3d(filters = 40, kernel_size = c(3,3,1),
kernel_initializer = keras::initializer_he_normal(),
kernel_regularizer = keras::regularizer_l1_l2(l1=0.00001, l2=0.0001),
name = "path_2_conv_5") %>%
keras::layer_activation_parametric_relu() %>%
keras::layer_batch_normalization() %>%
keras::layer_spatial_dropout_3d(rate=0.02) %>%
keras::layer_conv_3d(filters = 40, kernel_size = c(3,3,1),
kernel_initializer = keras::initializer_he_normal(),
kernel_regularizer = keras::regularizer_l1_l2(l1=0.00001, l2=0.0001),
name = "path_2_conv_6") %>%
keras::layer_activation_parametric_relu() %>%
keras::layer_batch_normalization() %>%
keras::layer_spatial_dropout_3d(rate=0.02) %>%
keras::layer_conv_3d(filters = 50, kernel_size = c(3,3,1),
kernel_initializer = keras::initializer_he_normal(),
kernel_regularizer = keras::regularizer_l1_l2(l1=0.00001, l2=0.0001),
name = "path_2_conv_7") %>%
keras::layer_activation_parametric_relu() %>%
keras::layer_batch_normalization() %>%
keras::layer_spatial_dropout_3d(rate=0.02) %>%
keras::layer_conv_3d(filters = 50, kernel_size = c(3,3,1),
kernel_initializer = keras::initializer_he_normal(),
kernel_regularizer = keras::regularizer_l1_l2(l1=0.00001, l2=0.0001),
name = "path_2_conv_8") %>%
keras::layer_activation_parametric_relu() %>%
keras::layer_batch_normalization() %>%
keras::layer_spatial_dropout_3d(rate=0.02) %>%
keras::layer_upsampling_3d(size=c(3,3,1))
# path_1_shape <- path_1$get_shape()$as_list() %>%
# unlist()
# path_2_shape <- path_2$get_shape()$as_list() %>%
# unlist()
# shape_diff <- path_1_shape - path_2_shape
# if(sum(shape_diff) > 0){
# path_2 <- path_2 %>%
# keras::layer_zero_padding_3d(padding = list(
# list(shape_diff[1],0),
# list(shape_diff[2],0),
# list(shape_diff[3],0)
# ))
# }
concat_layer <- keras::layer_add(list(path_1, path_2))
main_output <- concat_layer %>%
keras::layer_dense(units = 150, activation="relu") %>%
# keras::layer_alpha_dropout(rate=0.5) %>%
keras::layer_dense(units = 150, activation="relu") %>%
# keras::layer_alpha_dropout(rate=0.5) %>%
keras::layer_dense(units = model_params$num_classes,
activation = model_params$activation, name="main_output")
model <- keras::keras_model(inputs = c(input_path_1, input_path_2), outputs = main_output)
# model <- keras::keras_model(inputs = concat_layer, outputs = main_output)
model %>% keras::compile(optimizer = model_params$optimizer,
loss = model_params$loss,
metrics = model_params$metrics)
return(model)
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.