以下是一个可以使用的示例,然后是不适用的。
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))
这是一个简单的情况,只有两个输出。那么有很多输出的情况怎么样,你不想像我上面为y1
和y2
那样编写每个输出的脚本?这会在循环中添加输出:
# 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多个输出我想同时预测。
答案 0 :(得分:1)
This works,
Ylist <- paste0("list(",paste(colnames(Y),sep="",collapse=","),")")
model <- keras_model(input,eval(parse(text=Ylist)))