【发布时间】:2018-12-16 22:45:32
【问题描述】:
我正在尝试使用 keras for R 集成多个神经网络。为此,我想通过使用 "foreach" 来并行化不同网络的训练 循环。
models <- list()
x_bagged <- list()
y_bagged <- list()
n_nets = 2
bag_frac <-0.7
len <- nrow(x_train)
for(i in 1:n_nets){
sam <- sample(len, floor(bag_frac*len), replace=FALSE)
x_bagged[[i]] <- x_train[sam,]
y_bagged[[i]] <- y_train[sam]
models[[i]] <- keras_model_sequential()
models[[i]] %>%
layer_dense(units = 100, input_shape = ncol(x_train), activation = "relu", kernel_initializer = 'glorot_normal') %>%
layer_batch_normalization() %>%
layer_dense(units = 100, activation = custom_activation, kernel_initializer = 'glorot_normal') %>%
layer_dense(units = 1, activation = 'linear', kernel_initializer = 'glorot_normal')
models[[i]] %>% compile(
loss = "MSE",
optimizer= optimizer_sgd(lr=0.01)
)
}
library(foreach)
library(doParallel)
cl<-makeCluster(2)
registerDoParallel(cl)
nep <- 10
foreach(i = 1:n_nets,.packages=c("keras")) %dopar% {
models[[i]] %>% keras::fit(
x_bagged[[i]], y_bagged[[i]],
epochs = nep,
validation_split = 0.1,
batch_size =256,
verbose=1
)
}
stopCluster(cl)
使用 %do% 而不是 %dopar% 运行代码没有问题;但是,当我尝试在多个内核上同时安装网络时,出现以下错误:
{: 任务 1 失败 - “'what' 必须是函数或字符 字符串”回溯:
- foreach(i = 1:n_reti, .packages = c("keras")) %dopar% { .模型[[i]] %>% keras::fit(x_bagged[[i]], y_bagged[[i]], .
epochs = nep,validation_split = 0.1,batch_size = 256,.
详细 = 1) 。 }- e$fun(obj、substitute(ex)、parent.frame()、e$data)
有人知道我该如何克服这个错误吗?有没有其他方法可以在 R 上并行训练模型?
提前谢谢你!
【问题讨论】:
-
使用minimal, reproducible example 可以更容易地帮助您重现您的错误(另请参阅link)。
-
当我试图从不合适的模型中预测时,我遇到了这个错误。
-
我现在遇到了类似的问题。我怀疑这是因为 TensorFlow 后端不是为支持并行处理而设计的,并且使用 Reticulate 作为中介使其更加复杂。
标签: r tensorflow foreach keras doparallel