r - 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 中启动并运行?
解决方案
推荐阅读
- php - 无法从 cron 作业运行 laravel 计划在 cpanel 中不起作用
- redis - Redis,试图找出存储数据的最佳方式,以便分页显示
- mysql - 如何重新排列结果中的列?MySQL 工作台
- php - 未找到列:1054 Champ '0' inconnu dans field list
- python - 如何用pytorch实现Softmax回归?
- css - 粘性元素在带有溢出的嵌套弹性容器中不起作用(野生动物园)
- javascript - 将一组数据拆分为单独的数组
- excel - 将单元格和格式填入日期 -> 日期显示错误
- javascript - React 管理员在自定义数据提供程序上抛出“无法将未定义转换为对象”
- r - 尝试运行面板数据回归时出现错误“系统在计算上是奇异的”