用于 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 --> 为了使xy 适合模型,将其转换为矩阵,如下所示:

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.0001lr=0.01 相比较小的学习率正在制作模型以学习更稳健的预测

B) 基于数据集独立和响应分布的更高效层的变化

C) 如果预测的最终拟合结果似乎欠拟合,请尝试制作比广义模型更多的深度模型

D) 改变密集层的激活函数,在某些情况下也有帮助。

【讨论】:

您好,感谢您的回答以及有关 LSTM 模型的建议,它肯定会对我有所帮助。虽然它没有回答我的问题,但它让我朝着正确的方向前进。我将编辑我的帖子并回答我的问题。简而言之,问题是我的数组重塑的格式应该是 c(100,10,4) 而不是 c(10,4,100) 。我需要保留 100,因为我正在使用具有 100 个样本的多变量序列数据进行 LSTM 当然,您可以随意重塑您喜欢的数据。这是一个可重现示例的简要说明。

以上是关于用于 LSTM 的 Keras 多元形状的主要内容,如果未能解决你的问题,请参考以下文章

Keras 功能 api 输入形状错误,lstm 层收到 2d 而不是 3d 形状

LSTM Keras - 啥是正确的输入形状

Keras LSTM 层输入形状

keras LSTM 以正确的形状输入输入

Keras LSTM 第二层(但不是第一层)的输入形状错误

带有用于可变长度输入的掩蔽层的 Keras lstm