Keras lstm в R: как обеспечить правильные входные размеры - PullRequest
0 голосов
/ 24 апреля 2019

Я пытаюсь запустить модель lstm в R. Я взял код отсюда: https://machinelearningmastery.com/multivariate-time-series-forecasting-lstms-keras/ который прекрасно работает в python и пытался адаптировать его для R. Когда я запускаю процесс подгонки, я получаю следующее сообщение об ошибке:

Ошибка в py_call_impl (вызываемый, точки $ args, точки $ ключевые слова): ValueError: Ошибка при проверке ввода: ожидалось, что lstm_6_input будет иметь 3 измерения, но получил массив с формой (400, 1)

Я читал, что проблема может заключаться во входных измерениях, но входные измерения в R такие же, как в python, то есть 400x1x8 для данных X и 400 для данных y. Я также читал, что проблема может заключаться в выходных измерениях, и что указание 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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...