【问题标题】:Assign to common variable inside foreach and doParallel分配给 foreach 和 doParallel 中的公共变量
【发布时间】:2019-11-28 11:37:30
【问题描述】:

我正在使用 doParallelforeach 包来训练我拥有的数据集的 400 个小型 Keras 模型。

#1. Pre-make a blank data frame to be filled with values in the loop
Summary<-data.frame(ticker=character(), Today=numeric(), Tommorow=numeric(), MAPE=numeric(), stringsAsFactors=FALSE)

#2. Initialize cores to work
registerDoParallel(detectCores()-1)

#3. Implement for loop with parallel
foreach (i=1:400, .combine=c, .packages = c("keras", "tensorflow","dplyr","data.table")) %dopar% {
          ... code that filters data dynamically on [i] and fits the NN model...
          Summary[i,]<-c(tickers[i],
                         as.numeric(Predict[length(Predict)]),
                         model%>%predict(PredictorsT)%>%as.numeric(),
                         MAPE)
}

并行过程运行,但在循环结束时,摘要数据框保持空白,这意味着每次迭代都无法填充数据。我怎样才能做到这一点?

【问题讨论】:

  • 你不能在循环内全局保存结果,你需要用res=foreach (...)和循环内的return语句将它们保存在循环外。
  • 好的。怀疑是这个问题。我应该如何在循环中编写return语句来准备我需要的汇总数据

标签: r keras foreach doparallel


【解决方案1】:

将您的结果放入return 语句中。

Summary = foreach (i=1:400, .combine=c, .packages = c("keras", "tensorflow","dplyr","data.table")) %dopar% {
          ... code that filters data dynamically on [i] and fits the NN model...
          return(c(tickers[i],
                   as.numeric(Predict[length(Predict)]),
                   model%>%predict(PredictorsT)%>%as.numeric(),
                   MAPE))

你的组合应该是.combine=rbind

【讨论】:

  • 不需要return,在 R 中,这意味着“过早地中止函数执行”。
  • @KonradRudolph 其他语言不也是这样吗?我同意这不是绝对必要的,因为默认情况下 R 会返回最后一个结果,但这种方式更明确/更易于阅读。
  • @nba2020 不,我们可以断然排除这里需要 return(只是为了 120% 确定我刚刚测试过它)。您一定更改了其他内容。
  • @nba2020 这没有意义。 return 之后的代码没有被执行,所以你应该删除这些行,然后 return 就不再需要了。
  • @KonradRudolph 我删除了这些行,实际上return 不再需要了。非常感谢,因为我不知道那些行没有被执行
猜你喜欢
  • 2018-01-24
  • 1970-01-01
  • 1970-01-01
  • 2021-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-04
相关资源
最近更新 更多