我有以下代码,该代码使用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
。因此,我开始认为构建模型时的代码会错误地存储数据。
答案 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