Модель с несколькими входами и функцией генератора - Keras R - PullRequest
0 голосов
/ 19 апреля 2019

Я пытался построить модель с несколькими входами в керасах. Одна входная ветвь будет изображениями, а вторая - метаданными для соответствующих изображений.

Для изображений мне нужна функция генератора, которая будет вводить пакеты изображений. Метаданные представлены в табличной форме.

Теперь мне интересно, как мне передать данные в модель, чтобы правильное изображение было обработано с соответствующей информацией метаданных. Для вашей информации это будет задача регрессии.

Входные данные, которые у меня есть:

  • Изображения в dir1 /
  • Фрейм данных с путем и функциями.

    path       feature1 feature2 target
    image1.jpg 23.5     100      16
    image2.jpg 25.0     88       33
    

Код, который у меня сейчас есть:

  • функция генератора для изображений:

    train_datagen <- image_data_generator(rescale = 1/255)
    
    train_generator <- flow_images_from_dataframe(
      dataframe = joined_path_with_metadata,
      directory = 'data_dir',
      x_col = "path",
      y_col = "train",
      generator = train_datagen,
      target_size = c(150, 150),
      batch_size = 20,
      color_mode = 'rgb',
      class_mode = "sparse"
    )
    
  • определение модели:

    vision_model <- keras_model_sequential() 
    
    vision_model %>% 
      layer_conv_2d(filters = 64, 
                    kernel_size = c(3, 3), 
                    activation = 'relu', 
                    padding = 'same',
                    input_shape = c(150, 150, 3)) %>% 
      layer_max_pooling_2d(pool_size = c(2, 2)) %>% 
      layer_flatten()
    
    # Now let's get a tensor with the output of our vision model:
    image_input <- layer_input(shape = c(150, 150, 3))
    encoded_image <- image_input %>% vision_model
    
    # ANN for tabular data
    
    tabular_input <- layer_input(shape = ncol(dataframe), dtype = 'float32')
    
    mlp_model <- tabular_input %>% 
      layer_dense(
        units              = 16, 
        kernel_initializer = "uniform", 
        activation         = "relu") # Dropout to prevent overfitting
      layer_dropout(rate = 0.1) %>%
      layer_dense(
        units              = 32, 
        kernel_initializer = "uniform", 
        activation         = "relu") %>% 
    
    # concatenate the metadata and the image vector then
    # train a linear regression on it
    output <- layer_concatenate(c(mlp_model, encoded_image)) %>% 
      layer_dense(units = 1, activation='linear')
    
    
    # This is the final model:
    vqa_model <- keras_model(inputs = c(image_input, tabular_input), outputs = output)
    
  • компилировать:

    vqa_model %>% compile(
      optimizer = 'adam',
      loss      = 'mean_squared_error',
      metrics   = c('mean_squared_error')
    )
    

и последний шаг будет соответствовать модели. Я не уверен, как это сделать, чтобы убедиться, что первый ряд объектов будет принят в качестве метаданных изображений, которые считываются партиями.

...