1

I am trying to figure out the correct method of going about applying a keras model to each of my lists. I have used the iris dataset and created 4 lists and the goal is to correctly predict versicolor or virginica (I omit setosa because I want a binary classification model).

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')
  )

My problem occurs here. When I apply the below code:

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
    )
  )
  )

I get this error:

Error in py_get_item_impl(x, key, FALSE) : TypeError: 'Sequential' object does not support indexing

When I apply this code:

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
      )
    )

I get this error:

~fit(x = .x, y = .y, epochs = 5, batch_size = 20, validation_split = 0) Error in py_call_impl(callable, dots$args, dots$keywords) : Evaluation error: Unable to convert R object to Python type.

How can I map a keras model to each of the 4 datasets?

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

The following works for the first list:

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

EDIT: I seem to have solved it.

Putting the NN_model inside the fit() function appears to work.

future_map2(
    .x = iris_x_train,
    .y = iris_y_train,
    ~fit(NN_model,
      .x,
      .y,
      epochs = 5,
      batch_size = 20,
      validation_split = 0
    )
  )
user113156
  • 6,761
  • 5
  • 35
  • 81

0 Answers0