【问题标题】:Keras LSTM Dataset Sizing IssueKeras LSTM 数据集大小问题
【发布时间】:2018-10-18 15:36:29
【问题描述】:

我正在开展一个涉及使用 Keras 库(在 Tensorflow 上运行)进行 LSTM 预测的项目。

设置

我的训练“X”数据集(最初)是一个包含 52,000 多行 x 19 列的 Pandas 数据框。这 19 列包含 15 个当前外生读数和一个包含 4 个先前“Y”读数 (y(t-1)) 的时间步长。时间步的数量可能会发生变化(这意味着如果仅使用一个时间步不能产生良好的预测,我计划将数据集扩展到 52,000+ x 23)。我的训练“Y”数据集(最初也是)一个包含 52,000+ 行 x 4 列的 Pandas 数据框。使用以下代码将两个数据帧转换为 numpy 数组:

trainXArr = np.array(trainX)
trainXArr = np.reshape(trainXArr, (1, trainXArr.shape[0], trainXArr.shape[1]))
trainYArr = np.array(trainY)

print 语句确认处理后的数据维度为 trainXArr.shape = (1, 52590, 19) 和 trainYArr.shape = (52590, 4)。这与我在 Internet 上看到的一些教程一致,但有一个例外:通常 trainYArr.shape 看起来像 (52590,)。

该模型的目标是对四个点进行预测(因此 ,4 为 trainYArr 数组的形状)。理想情况下,所有四个点都将在同一个模型中进行预测,而不是创建四个单独的模型,每个模型都有一个输出。我的模型定义如下:

model = Sequential()
model.add(LSTM(4, input_shape=(trainXArr.shape[1], trainXArr.shape[2]), activation='sigmoid'))
model.add(Dense(4))
model.compile(loss='mean_squared_error', optimizer='adam', metrics=['mse', 'mae'])

问题

当我按照第一个代码框的描述运行模型时,我收到以下错误:ValueError: Input arrays should have the same number of samples as target arrays. Found 1 input samples and 52590 target samples. 我读到这个错误是说我的数据集的维度有问题。

疑难解答

为了解决这个问题,我采取了一些步骤:

1) 将第二行(第一个代码框)更改为 trainXArr = trainXArr = np.reshape(trainXArr, (trainXArr.shape[0], 1, trainXArr.shape[1])) 会导致错误 ValueError: Error when checking input: expected lstm_1_input to have 3 dimensions, but got array with shape (8738, 19)

我不知道这个 8738 数字来自哪里,因为我的代码中没有包含长度 8738 的内容。

2) 添加行 trainYArr = np.reshape(trainYArr, (1, trainYArr.shape[0], trainYArr.shape[1])) 会给出错误:ValueError: Error when checking target: expected dense_1 to have 2 dimensions, but got array with shape (1, 52590, 4)

这表明我的问题归结为目标数据集的形状(使我回到初始状态)或密集层的配置。

3) 在注释掉 Dense 层的同时应用 #2 会产生错误:ValueError: Error when checking target: expected lstm_1 to have 2 dimensions, but got array with shape (1, 52590, 4)

不...必须是目标数据的形状。

4) 将 Dense 层注释掉并删除 trainYArr = np.reshape... 行会产生错误:ValueError: Input arrays should have the same number of samples as target arrays. Found 1 input samples and 52590 target samples.

我们又回到了起点……

问题

在完成所有这些故障排除之后,我承认我在理解如何设置数据以适应 LSTM 模型时遇到了问题。我的问题是:

1) 是否可以使用 Keras 创建一个可以同时预测所有四个输出的 LSTM?

2) 我应该如何构建我的数据以便我可以训练 LSTM/Dense 模型?

谢谢!

【问题讨论】:

    标签: python numpy keras


    【解决方案1】:

    LSTM 接受

    形式的数据
    (no_of_samples,timesteps,no_of_features)
    

    ValueError:输入数组的样本数应与目标数组相同。找到 1 个输入样本和 52590 个目标样本。

    关于原始问题,模型认为您有 1 个样本,具有 52000 个时间步长,每个具有 19 个特征,因为训练数据的形状为 (1,52000,19)。另一方面,所提供标签的形状,即 (52000,4) 意味着您有 52000 个样本的 4 个标签。这就是您收到不匹配错误的原因。

    这 19 列包含 15 个当前外部读数和一个包含 4 个先前“Y”读数 (y(t-1)) 的时间步。

    如果我理解正确,那么之前时间步的 4 个读数在其他 15 个特征中也会有当前时间步的相应读数
    即(之前的 4 个读数)+(当前对应的 4 个读数)+(其他 11 个读数)= 总计 19
    所以你的时间步长是一次两个。

    我应该如何构造我的数据以便我可以训练 LSTM/Dense 模型?

    我不知道应用程序或上下文以及为什么您只为之前的时间步传递 4 个功能。但是您的输入形状应该类似于 (52000,2,no_of_features)。也许您可能会拆分模型的输入。第一个输入流将是与时间相关并进入 LSTM 的 4 个特征。第二个输入将是其余的,然后你在 LSTM 之后加入它们。但这只是其中一种解决方案

    是否可以使用 Keras 创建一个可以同时预测所有四个输出的 LSTM?

    是的,你可以

    【讨论】:

    • 感谢您的快速回复。我只需要澄清一下:关于评论 1)我喜欢 X 数组的设置(1 个具有 52k 时间步长和 19 个特征的样本)。有什么方法可以强制将 Y 数组解释为具有 4 个(输出)特征的 52k 时间步长的 1 个样本?我尝试在疑难解答#2 中执行此操作,但我遇到了密集层的问题。评论 3)这是否提供了两种不同的建议 - 一种是在网络中的不同时间步长中具有重复时间和外生变量,另一种是我将外生变量应用于 Dense 层?
    • 在这种情况下,Y 数组可以是 (1,4)。不需要时间步长。我的建议是在一个分支中处理时间变量(您为现在和以前提供的变量),并在另一个分支中处理其余变量(您仅用于当前)。然后稍后合并它们。但这只是一种解决方案
    猜你喜欢
    • 2017-07-29
    • 2018-10-11
    • 2018-10-16
    • 2017-07-27
    • 1970-01-01
    • 2019-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多