语境
我目前正在Keras中使用 LSTM / GRU 进行一些实验。无论如何,以下问题也与这些网络的一般功能有关,这意味着答案不必是特定于 Keras 的。
对于我的实验,我选择以 a 的形式预测一个线性增长的时间序列,range(10,105,5)
这样我显然会得到很好的结果。我的数据生成器遵循本教程(只是 Keras 的一个实现TimeSeriesGenerator
)。
[[[10. 15.]
[20. 25.]]] => [[30. 35.]]
...
[[[80. 85.]
[90. 95.]]] => [[100. 105.]]
这导致8 steps_per_epoch
和 的样本shape (8, 1, 2, 2)
。然后我在 Keras 中建立了一个简单的网络,并对其进行了训练500 epochs
:
model = Sequential()
model.add(GRU(100, activation='relu', input_shape=(n_input, n_features), batch_size=1)) #Could also be a LSTM-layer
model.add(Dense(2)) #Following the target-shape
model.compile(optimizer='adam', loss='mse')
如果我之后像这样预测一些数据......
x_input = np.array([[90, 95], [100, 105]]).reshape((1, n_input, n_features))
yhat = model.predict(x_input, verbose=0)
...结果/预测是[[111.1233 116.97075]]
(对于实验来说足够好->正确的是[[110.0 115.0]]
)。
我的问题
显然 500 个 epoch 远远超过了这一数据量的需要。
为了在不增加实际数据的情况下获得更多的训练数据(在实际场景中这也是不可能的),我想出了使用重叠滑动窗口的想法(上面显示的批次是不重叠的)。
然后批次看起来像这样:
[[[10. 15.]
[20. 25.]]] => [[30. 35.]]
[[[15. 20.]
[25. 30.]]] => [[35. 40.]]
[[[20. 25.]
[30. 35.]]] => [[40. 45.]]
...
从理论上讲,这对我来说意味着更多的批次,我认为培训质量会相应提高。
无论如何,将这些数据提供给相同的网络会导致以下预测:[[121.1334 134.70979]]
. 嗯..这些是更糟糕的预测结果。
我现在的问题是:
- 这是 LSTM / GRU 的预期行为吗?为什么重叠窗口对他们来说是个问题?
- 有没有办法在不破坏预测质量的情况下以这种方式增加我的数据?