【发布时间】: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 模型?
谢谢!
【问题讨论】: