Отображение кераса NN на списки данных в R - PullRequest
1 голос
/ 22 января 2020

Я пытаюсь найти правильный метод применения модели keras к каждому из моих списков. Я использовал набор данных iris и создал 4 списка, и цель состоит в том, чтобы правильно предсказать versicolor или virginica (я опускаю setosa, потому что хочу модель двоичной классификации).

data(iris)
iris <- iris %>% 
  mutate(
    splt = sample(4, size = nrow(.), replace = TRUE),
    binary = case_when(
      Species == "versicolor" ~ 0,
      Species == "virginica" ~ 1
    )
  ) %>%  
  filter(Species != "setosa") %>% 
  split(., .$splt)

iris_x_train <- iris %>% 
  map(., ~select(., Sepal.Length, Sepal.Width, Petal.Length, Petal.Width) %>% 
        as.matrix())

iris_y_train <- iris %>% 
  map(., ~select(., binary) %>% 
        to_categorical(2))

NN_model <- keras_model_sequential() %>% 
  layer_dense(units = 4, activation = 'relu', input_shape = 4) %>% 
  layer_dense(units = 2, activation = 'softmax')

NN_model %>% 
  summary

NN_model %>% 
  compile(
    loss = 'binary_crossentropy',
    optimizer_sgd(lr = 0.01, momentum = 0.9),
    metrics = c('accuracy')
  )

Моя проблема возникает здесь. Когда я применяю следующий код:

NN_model %>%
  future_map(., ~future_map2(
    .x = iris_x_train,
    .y = iris_y_train,
    ~fit(
      x = .x,
      y = .y,
      epochs = 5,
      batch_size = 20,
      validation_split = 0
    )
  )
  )

я получаю эту ошибку:

Ошибка в py_get_item_impl (x, ключ, FALSE): TypeError: объект 'Sequential' не поддерживает индексация

Когда я применяю этот код:

NN_model %>%
  future_map2(
    .x = iris_x_train,
    .y = iris_y_train,
    ~fit(
      x = .x,
      y = .y,
      epochs = 5,
      batch_size = 20,
      validation_split = 0
      )
    )

Я получаю эту ошибку:

~ fit (x = .x, y =. y, epochs = 5, batch_size = 20, validation_split = 0) Ошибка в py_call_impl (вызываемый, точки $ args, точки $ ключевые слова): Ошибка оценки: невозможно преобразовать объект R в тип Python.

Как мне сопоставить модель keras с каждым из 4 наборов данных?

library(keras)
library(tensorflow)
library(furrr)
library(purrr)

Для первого списка работает следующее:

NN_model %>% 
  fit(
    x = iris_x_train[[1]],
    y = iris_y_train[[1]],
    epochs = 50,
    batch_size = 20,
    validation_split = 0
  )

РЕДАКТИРОВАТЬ: Кажется, я решил это.

Помещение NN_model в функцию fit(), похоже, работает.

future_map2(
    .x = iris_x_train,
    .y = iris_y_train,
    ~fit(NN_model,
      .x,
      .y,
      epochs = 5,
      batch_size = 20,
      validation_split = 0
    )
  )
...