在Keras R接口中使用带有自定义生成器的predict_生成器时出错

在Keras R接口中使用带有自定义生成器的predict_生成器时出错,r,keras,R,Keras,我一直在阅读R的深度学习,第6章介绍了生成器。以下是在fit_generator或evaluate_generator中使用时不会产生问题的生成器(样本、输出): generator <- function(data, lookback, delay, min_index, max_index, shuffle = FALSE, batch_size = 60, step = 1) { if (is.null(max_index))

我一直在阅读R的深度学习,第6章介绍了生成器。以下是在fit_generator或evaluate_generator中使用时不会产生问题的生成器(样本、输出):

generator <- function(data, lookback, delay, min_index, max_index,
                      shuffle = FALSE, batch_size = 60, step = 1) {
  if (is.null(max_index))
    max_index <- nrow(data) - delay - 1
  i <- min_index + lookback
  function() {
    if (shuffle) {
      rows <- sample(c( (min_index+lookback) : max_index ), size = batch_size)
    } else {
      if (i + batch_size >= max_index)
        i <<- min_index + lookback
      rows <- c(i : min(i + batch_size - 1, max_index))
      rows
      length(rows)
      i <<- i + length(rows)
    }

    samples <- array(0, dim = c(length(rows), 
                                lookback / step,
                                dim(data)[[-1]]))
    targets <- array(0, dim = c(length(rows)))

    for (j in 1:length(rows)) {
      indices <- seq(rows[[j]] - lookback, rows[[j]], 
                     length.out = dim(samples)[[2]])
      samples[j,,] <- data[indices,]
      targets[[j]] <- data[rows[[j]] + delay, 9]
    }            

    list(samples, targets)
  }
}

test_gen <- generator(
  data,
  lookback = lookback,
  delay = delay,
  min_index = validation_index+1,
  max_index = NULL,
  step = step,
  batch_size = batch_size
)
## no issues here
test_steps <- (nrow(data) - validation_index+1 - lookback) / batch_size
perf <- my_model %>% evaluate_generator(test_gen, steps = test_steps)
我读到生成器必须返回与predict_on_batch作为输入的对象相同的对象。我成功运行了以下程序:

test_gen_pred <- generator_pred(
  data,
  lookback = lookback,
  delay = delay,
  min_index = validation_index+1,
  max_index = NULL,
  step = step,
  batch_size = batch_size
)

t <- test_gen_pred()
predict_on_batch(my_model, t)

test\u gen\u pred几天来,我一直在寻找完全相同的答案,最后让我的pred生成器返回一个列表(而不是直接返回样本)使它工作起来

就你而言:

generator_pred <- function(data, lookback, delay, min_index, max_index,
                  shuffle = FALSE, batch_size = 60, step = 1) {
    <...>            
    list(samples)
  }
}

generator\u pred几天来,我一直在寻找完全相同的答案,最后让我的pred\u generator返回一个列表(而不是直接返回样本),让它开始工作

就你而言:

generator_pred <- function(data, lookback, delay, min_index, max_index,
                  shuffle = FALSE, batch_size = 60, step = 1) {
    <...>            
    list(samples)
  }
}
generator\u pred您也可以使用from-package,如果您想使用它进行预测,它提供了
return\u-target
选项

一些简单的例子

首先进行一些监督设置:

# example data
data <- data.frame(
  x = runif(80),
  y = runif(80),
  z = runif(80)
)

# variables
x <- c("x", "y")
y <- 2:3

# supervise settings
lookback <- 10
timesteps <- 10

# number of train sample
train_length <- 40

# data settings
batch_size <- 10

# train row indices
train_end <- nrow(data)
train_start <- train_end - train_length + 1

# number of steps to see full data
train_steps <- train_length / batch_size
#示例数据
数据您也可以使用from包,如果您想使用它进行预测,它提供了
返回\u目标
选项

一些简单的例子

首先进行一些监督设置:

# example data
data <- data.frame(
  x = runif(80),
  y = runif(80),
  z = runif(80)
)

# variables
x <- c("x", "y")
y <- 2:3

# supervise settings
lookback <- 10
timesteps <- 10

# number of train sample
train_length <- 40

# data settings
batch_size <- 10

# train row indices
train_end <- nrow(data)
train_start <- train_end - train_length + 1

# number of steps to see full data
train_steps <- train_length / batch_size
#示例数据

数据谢谢!我最终使用了一个完全不同的设置,因为我无法让它工作。很appreciated@pbordeaux你能分享一下你是如何解决的吗?谢谢!我最终使用了一个完全不同的设置,因为我无法让它工作。很appreciated@pbordeaux你能分享一下你是如何解决的吗?
# import libs
library(kerasgenerator)

# train generator
train_gen <- series_generator(
  data = data,
  y = y,
  x = x,
  lookback = lookback,
  timesteps = timesteps,
  start_index = train_start,
  end_index = train_end,
  batch_size = batch_size,
  return_target = TRUE
)

# predict generator
predict_gen <- series_generator(
  data = data,
  y = y,
  x = x,
  lookback = lookback,
  timesteps = timesteps,
  start_index = train_start,
  end_index = train_end,
  batch_size = batch_size,
  return_target = FALSE
)
# import libs
library(keras)

# initiate a sequential model
model <- keras_model_sequential()

# define the model
model %>%

  # layer lstm
  layer_lstm(
    name = "lstm",
    input_shape = list(timesteps, length(x)),
    units = 16,
    dropout = 0.1,
    recurrent_dropout = 0.1,
    return_sequences = FALSE
  ) %>%

  # layer output
  layer_dense(
    name = "output",
    units = length(y)
  )

# compile the model
model %>% compile(
  optimizer = "rmsprop",
  loss = "mse"
)

# model summary
summary(model)

# set number of epochs
epochs <- 10

# model fitting
history <- model %>% fit_generator(
  generator = train_gen,
  steps_per_epoch = train_steps,
  epochs = epochs
)

# history plot
plot(history)

# evaluate on train dataset
model %>% evaluate_generator(
  generator = train_gen,
  steps = train_steps
)

# predict on train dataset
model %>% predict_generator(
  generator = predict_gen,
  steps = train_steps
)