首页 > 解决方案 > R中的Keras lstm:如何确保正确的输入尺寸

问题描述

我正在尝试在 R 中运行 lstm 模型。我从这里获取了代码: https ://machinelearningmastery.com/multivariate-time-series-forecasting-lstms-keras/ 它在 python 中运行良好并试图适应它R. 当我运行拟合过程时,我收到以下错误消息:

py_call_impl(callable, dots$args, dots$keywords) 中的错误:ValueError:检查输入时出错:预期 lstm_6_input 具有 3 个维度,但得到的数组形状为 (400, 1)

我已经读到问题可能出在输入维度上,但是 R 中的输入维度与 python 中的相同,即 X 数据为 400x1x8,y 数据为 400。我还读到问题可能出在输出维度上,并且return_sequences=FALSE在图层定义中指定可能会有所帮助,但我仍然收到相同的错误消息。
我已经包含了下面的代码,因为我从 MachineLearningMastery 网站翻译了它,但在开始时没有初始数据清理和保存步骤,以使其更短。

rm(list=ls())
library(caret)
library(dplyr)
library(data.table)
library(keras)

source("SeriesToSupervised.R") #included at end of code
dataset <- read.table(fn, stringsAsFactors=F, comment.char="",row.names = NULL,sep=",",header=TRUE)
#label encoding windspeed 
dataset$wnd_dir_num <- 0
dataset$wnd_dir_num[dataset$wnd_dir=="NW"]<-1
dataset$wnd_dir_num[dataset$wnd_dir=="SE"]<-2
dataset$wnd_dir_num[dataset$wnd_dir=="cv"]<-3

DataToUse <- dataset[,c(2:5,10,7:9)]
rownames(DataToUse) <- dataset[,1]
DataToUse$dew <- as.numeric(DataToUse$dew)
DataToUse$snow <- as.numeric(DataToUse$snow)
DataToUse$rain <- as.numeric(DataToUse$rain)

#center and scale - used Caret here, rather than Python routines
preProcValues <- preProcess(DataToUse, method = c("center", "scale"))
scaled <- predict(preProcValues, DataToUse)

#frame as supervised learning
n_out <- 1; n_in <- 1
reframed <- SeriesToSupervised(scaled, n_in=n_in, n_out=n_out, dropnan=T)
# drop columns we don't want to predict
reframed <- reframed[,(1:(n_in*ncol(scaled)+1))]

#make training/test split
nVar <- ncol(reframed)-1
train_X <- reframed[1:400,1:nVar] #just a small sample to get things working - can expand later
test_X <- reframed[401:600,1:nVar]
train_y <- reframed[1:400,1]
test_y <- reframed[401:600,1]

# reshape input to be 3D [samples, timesteps, features]
train_X <- array(data=train_X,dim=c(nrow(train_X),n_in,nVar))
test_X <- array(test_X,dim=c(nrow(test_X),n_in,nVar))

# design network
model <- keras_model_sequential()
model %>%
  layer_lstm(units = 32,
             input_shape = c(n_in,nVar)) %>%
  layer_dense(units = 1)
model %>% compile(loss = 'mae', optimizer = 'adam')

# fit network
history <- model %>% fit(
  x=train_X, 
  y=train_y,
  epochs = 20, 
  batch_size = 72, 
  validation_data = list(test_X, test_y), 
  shuffle=FALSE,
)
SeriesToSupervised <- function(data, n_in=1, n_out=1, dropnan=True){
  #n_vars = 1 if type(data) is list else data.shape[1]
  n_vars <- ncol(data)
  cols <- list()
  MyNames <- character(0)
  i<-n_in
  while (i > 0){
    cols[[i]] <- data.frame(shift(data, n=i))
    for (j in 1:n_vars){
      MyNames <- c(MyNames, paste0("var",j,"(t-",i,")"))
    }
    i<-i-1
  }
  for (i in 1:n_out){
    cols[[length(cols)+1]] <- data.frame(shift(data, n=(i-1)))
    for (j in 1:n_vars){
      if (i==1){
        MyNames <- c(MyNames, paste0("var",j,"(t)"))
      } else {
        MyNames <- c(MyNames, paste0("var",j,"(t+",i,")"))
      }
    }
  }
  agg <- bind_cols(cols) # put it all together
  colnames(agg) <- MyNames

  if (dropnan){ # drop rows with NaN values
    agg <- agg[complete.cases(agg),]
  }
}

谁能让我知道我可以做些什么来让这个简单的 lstm 在 R 中启动并运行?

标签: rkeraslstm

解决方案


推荐阅读