将keras模型映射到小标题列表上

时间:2020-02-11 21:42:15

标签: r keras

我有以下代码,该代码使用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

编辑:

当我在EDIT 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 个答案:

答案 0 :(得分:1)

似乎没有捕获所有属性是一个问题。如果我们进行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