R keras 声明多个输出



下面是一个工作的例子,后面跟着那些不起作用的例子。

library(keras)
# placeholder data
Y <- data.frame(y1=1:100,y2=1:100)
X <- data.frame(x1=1:100,x2=1:00,x3=1:100)
# add covariates
input <- layer_input(shape=dim(X)[2],name="covars")
# add hidden layers
base_model <- input  %>%
  layer_dense(units = 3, activation='relu') %>%
  layer_dense(units = 2, activation='relu') 
# add outputs
y1 <- base_model %>% 
  layer_dense(units = 1, name="y1") 
y2 <- base_model %>% 
  layer_dense(units = 1, name="y2") 
# combine
model <- keras_model(input,list(y1,y2))

这是只有两个输出的简单情况。如果有许多输出的情况,您不想像我上面那样为y1y2编写每个输出的脚本怎么办?这会在循环中添加输出:

# add outputs in loop
for(i in 1:dim(Y)[2]){
  y <- colnames(Y)[i]
  outstring <- paste0(
    sprintf("%s <- base_model %%>%%", y), 
    sprintf(" layer_dense(units = 1, name='%s')",y)
  )
  eval(parse(text=outstring))
}

但是我不知道如何将输出列表传递给编译函数。此尝试:

Ylist <- do.call(c, apply(Y, 2, list))
model <- keras_model(input,Ylist)

返回以下错误:

Error in py_call_impl(callable, dots$args, dots$keywords) : 
  TypeError: unhashable type: 'list' 

我也尝试了keras_array()

model <- keras_model(input,keras_array(Ylist))

其中返回:

Error in py_call_impl(callable, dots$args, dots$keywords) : 
  TypeError: unhashable type: 'numpy.ndarray' 

如果有一种方法可以绕过我的for-loop使用sprintf(),我可以不命名输出。我正在处理的问题有 20 多个输出,我想同时预测。

这有效,

Ylist <- paste0("list(",paste(colnames(Y),sep="",collapse=","),")")
model <- keras_model(input,eval(parse(text=Ylist)))

相关内容

  • 没有找到相关文章

最新更新