отображение модели кераса на список элементов - PullRequest
1 голос
/ 12 февраля 2020

У меня есть код ниже, который использует набор данных iris для обучения ряда моделей машинного обучения:

Я хочу сделать прогнозы для модели keras. Приведенный ниже код работает, и я могу получить прогнозы для всех моделей (кроме модели keras):

Когда я раскомментирую часть кода else if - keras, я получаю «ошибки» или модель производит.

[1] "skipping\n"
[1] "skipping\n"
[1] "skipping\n"
[1] "skipping\n"
[1] "skipping\n"
[1] "skipping\n"
[1] "skipping\n"
[1] "skipping\n"
[1] "skipping\n"
[1] "skipping\n"
[1] "skipping\n"
[1] "skipping\n"

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

  # else if(attr(x, "class")[1] == "keras_training_history"){
  #   # Keras Single Layer Neural Network
  #   tibble(
  #     modelname = attr(x, "class")[1],
  #     prediction = predict_classes(object = x, x = as.matrix(dat))
  #   )
  # }

РЕДАКТИРОВАТЬ 1:

Моя попытка отладки:

dat <- iris %>% 
  filter(Species != "setosa") %>% 
  mutate(Species = +(Species == "virginica"))

mod <- keras_model_sequential() %>% 
  layer_dense(units = 2, activation = 'relu', input_shape = 2) %>% 
  layer_dense(units = 2, activation = 'softmax')
mod
mod %>% compile(
    loss = 'binary_crossentropy',
    optimizer_sgd(lr = 0.01, momentum = 0.9),
    metrics = c('accuracy')
  ) 
mod
fit(mod, 
    x = as.matrix(dat[, 2:3]),
    y = to_categorical(dat$Species, 2),
    epochs = 5,
    batch_size = 5,
    validation_split = 0
  )

predict_classes(mod, as.matrix(dat[, 2:3]))

Дает мне:

[1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 [44] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 [87] 0 0 0 0 0 0 0 0 0 0 0 0 0 0

РЕДАКТИРОВАТЬ:

Когда я запускаю код в РЕДАКТИРОВАТЬ 1., а затем передать:

attr(mod, "class")

Я получаю следующий вывод:

[1] "keras.engine.sequential.Sequential"                        
[2] "keras.engine.training.Model"                               
[3] "keras.engine.network.Network"                              
[4] "keras.engine.base_layer.Layer"                             
[5] "tensorflow.python.module.module.Module"                    
[6] "tensorflow.python.training.tracking.tracking.AutoTrackable"
[7] "tensorflow.python.training.tracking.base.Trackable"        
[8] "python.builtin.object"

Однако, когда я запускаю код models_list, а затем запускаю следующее:

attr(models_list[[1]]$models$Model_Keras, "class")

я получаю:

[1] "keras_training_history"

Так что я передаю другой функция к predict. Поэтому я начинаю думать, что код при построении модели хранит данные неправильно.

1 Ответ

1 голос
/ 12 февраля 2020

Кажется, проблема не в том, чтобы захватить все атрибуты. Если мы сделаем assign, это будет работать. Ниже, покажите один случай, используя только модель keras (Внесите изменения, обернув с if/else)

models_list <- var_combos %>%
                    mutate(modeln = str_c('mod', row_number()))  %>%
                    pmap(~ 
                          {

                           xname = ..1
                           yname = ..2
                           modelname = ..3
                           df %>%
                              select(Species, xname, yname) %>%
                               group_by(grp = 'grp') %>%
                               nest() %>%
                               mutate(models = map(data, ~{


                                list(Model_Keras = {
                                mod <- keras_model_sequential() %>% 
                                  layer_dense(units = 2, activation = 'relu', input_shape = 2) %>% 
                                  layer_dense(units = 2, activation = 'softmax')

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


                                  fit(mod, 
                                      x = as.matrix(.x[, 2:3]),
                                      y = to_categorical(.x$Species, 2),
                                      epochs = 5,
                                      batch_size = 5,
                                      validation_split = 0
                                    )
                                print(modelname)        
                                assign(modelname, mod)                      

                                }   )                      

                                   }                               
                               ))                 

                              })

Теперь примените это к predict_classes

models_predict <- map2(models_list, boundary_lists, ~{
     mods <- purrr::pluck(.x, "models")
      dat <- .y
      map(mods, function(x) 
        predict_classes(object = x$Model_Keras, x = as.matrix(dat)))

  })

выход

head(models_predict[[5]][[1]])
#[1] 1 1 1 1 1 1
head(models_predict[[7]][[1]])
#[1] 0 0 0 0 0 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...