用于 LSTM 的 Keras 多元形状
Posted
技术标签:
【中文标题】用于 LSTM 的 Keras 多元形状【英文标题】:Keras Multivariate Shape for LSTM 【发布时间】:2021-10-25 12:53:54 【问题描述】:我正在尝试塑造数据框,以便能够在 R 上运行 LSTM。
我有 100 个列表,每个列表有 4 个特征和 10 行,我想预测 100 个值。 我已将我的列表重塑为一个数组尝试运行模型,但出现类似于此的错误
ValueError: Data cardinality is ambiguous:
x sizes: 10
y sizes: 100
我不明白我需要将什么形状应用于我的数组才能使其工作
我将我的问题重新创建为数据样本
library("keras")
#creation of the dataframe
x <- data.frame(
x1 = sample(c(0,1), replace=TRUE, size=1000),
x2 = sample(c(0,1), replace=TRUE, size=1000),
x3 = sample(c(0,1), replace=TRUE, size=1000),
x4 = sample(c(0,1), replace=TRUE, size=1000)
)
y <- data.frame( y = sample(c(0,1), replace=TRUE, size=100))
#transform into list
x_list <- list()
for(i in 1:100)
x_list[[i]] <- x[(10*i+1) :((1+i)*10),]
#transform into array
arr_x <- array_reshape(as.numeric(unlist(x_list)),
dim = c(dim(x_list[[1]])[1],
dim(x_list[[1]])[2],
length(x_list) )
)
dim(x_list[[1]])[1]
dim(x_list[[1]])[2]
length(x_list)
lstm_model <- keras_model_sequential()
lstm_model %>%
layer_lstm(units = 64,
input_shape = c(10,4),
return_sequences = TRUE
)
lstm_model %>%
compile(optimizer = 'rmsprop', metrics = 'binary_crossentropy')
summary(lstm_model)
lstm_model %>% fit(
x = arr_x,
y = y,
batch_size = 1,
epochs = 20,
verbose = 0,
shuffle = FALSE
)
【问题讨论】:
【参考方案1】:阅读 Jovan 的评论后,我明白了如何解决我的问题 基本上我的数组的形状被定义为 10,4,100
arr_x <- array_reshape(as.numeric(unlist(x_list)),
dim = c(dim(x_list[[1]])[1],
dim(x_list[[1]])[2],
length(x_list) )
)
但多元 LSTM 的数组必须采用这种形状(样本、步骤、特征)
在这种情况下,它应该是 c(100,10,4),因为我有 100 个样本、10 个步骤和 4 个特征
arr_x <- array_reshape(as.numeric(unlist(x_list)),
dim = c(length(x_list) ,
dim(x_list[[1]])[1],
dim(x_list[[1]])[2] )
)
【讨论】:
【参考方案2】:您的 LSTM 模型需要完全相同数量的 X 和 Y 训练大小,如果您打算将其划分为训练集和测试集,这也是测试大小,因为它不会对 100 行响应变量 Y 训练 1000 行 X(独立)的任何意义,如果您想针对 100 个预测变量训练数据集,也使用 100 行独立变量
1 --> 所以我在这里更新您的示例数据集:
x <- data.frame(
x1 = sample(c(0,1), replace=TRUE, size=1000),
x2 = sample(c(0,1), replace=TRUE, size=1000),
x3 = sample(c(0,1), replace=TRUE, size=1000),
x4 = sample(c(0,1), replace=TRUE, size=1000)
)
y <- data.frame(y = sample(c(0,1), replace=TRUE, size=1000))
2 --> 然后,转到构建 LSTM 模型层并编译,这里我做了一些修改,我在 LSTM 和 return_sequences
之后添加了 1 个密集层到 FALSE
,基于我的经验,如果你要训练一个深度 LSTM 模型,请使用return_sequences=TRUE
,然后在 LSTM 模型的末尾使用return_sequences=FALSE
将权重返回到另一层,在编译阶段添加loss
参数是强制性的,这将计算模型的误差项:
lstm_model <- keras_model_sequential()
lstm_model %>%
layer_lstm(units = 64, input_shape = c(4,1), return_sequences = FALSE) %>%
layer_dense(1, activation="relu")
lstm_model %>%
compile(optimizer = 'rmsprop',
metrics = 'binary_accuracy',
loss = "binary_crossentropy")
3 --> 为了使x
和y
适合模型,将其转换为矩阵,如下所示:
x_mat <- as.matrix(x)
y_mat <- as.matrix(y)
dim(x_mat) <- c(nrow(x_mat), ncol(x_mat), 1) # Make X (The Independent into 3 Dimensional)
lstm_model %>% fit(
x = x_mat,
y = y_mat,
batch_size = 2,
validation_split=0.7, #I add this so 700 datasets will be train instead of 1000 (300 will be used as validation (testing datasets))
epochs = 10,
verbose = 1,
shuffle = FALSE
)
4 --> 然后模型将开始学习,如果您发现准确度不是很令人满意,我自己记录的一些技巧是尝试通过以下方式进行调整:
A) 优化器参数中的学习率参数,例如 lr=0.0001
与 lr=0.01
相比较小的学习率正在制作模型以学习更稳健的预测
B) 基于数据集独立和响应分布的更高效层的变化
C) 如果预测的最终拟合结果似乎欠拟合,请尝试制作比广义模型更多的深度模型
D) 改变密集层的激活函数,在某些情况下也有帮助。
【讨论】:
您好,感谢您的回答以及有关 LSTM 模型的建议,它肯定会对我有所帮助。虽然它没有回答我的问题,但它让我朝着正确的方向前进。我将编辑我的帖子并回答我的问题。简而言之,问题是我的数组重塑的格式应该是 c(100,10,4) 而不是 c(10,4,100) 。我需要保留 100,因为我正在使用具有 100 个样本的多变量序列数据进行 LSTM 当然,您可以随意重塑您喜欢的数据。这是一个可重现示例的简要说明。以上是关于用于 LSTM 的 Keras 多元形状的主要内容,如果未能解决你的问题,请参考以下文章