【发布时间】:2018-07-07 14:04:27
【问题描述】:
来源
有几个来源解释了有状态/无状态 LSTM 以及我已经阅读过的 batch_size 的作用。我稍后会在我的帖子中提及它们:
[1]https://machinelearningmastery.com/understanding-stateful-lstm-recurrent-neural-networks-python-keras/
[2]https://machinelearningmastery.com/stateful-stateless-lstm-time-series-forecasting-python/
[3]http://philipperemy.github.io/keras-stateful-lstm/
[4]https://machinelearningmastery.com/use-different-batch-sizes-training-predicting-python-keras/
还有其他 SO 线程,例如 Understanding Keras LSTMs 和 Keras - stateful vs stateless LSTMs,但它们并没有完全解释我在寻找什么。
我的问题
我仍然不确定关于状态和确定 batch_size 的任务的正确方法是什么。
我有大约 1000 个独立的时间序列 (samples),每个时间序列的长度约为 600 天 (timesteps)(实际上是可变长度,但我考虑将数据修剪为一个恒定的时间范围),具有 8 个特征(或input_dim) 对于每个时间步长(某些特征与每个样本相同,每个样本都有一些特征)。
Input shape = (1000, 600, 8)
其中一个特征是我想要预测的,而其他的(应该是)支持这个“主要特征”的预测。我将为 1000 个时间序列中的每一个都这样做。对这个问题建模的最佳策略是什么?
Output shape = (1000, 600, 1)
什么是批处理?
来自 [4]:
Keras 使用快速符号数学库作为后端,例如 TensorFlow 和 Theano。
使用这些库的一个缺点是,无论您是在训练网络还是进行预测,都必须预先定义一次数据的形状和大小并保持不变。
[…]
当您希望进行的预测少于批量大小时,这确实会成为一个问题。例如,您可能会通过大批量获得最佳结果,但您需要在时间序列或序列问题等问题上一次对一个观察结果进行预测。
在我看来,这听起来像是一个“批处理”将沿timesteps-维度拆分数据。
但是,[3] 声明:
换句话说,无论何时训练或测试 LSTM,您首先必须构建形状为
nb_samples, timesteps, input_dim的输入矩阵X,其中批量大小除以nb_samples。例如,如果nb_samples=1024和batch_size=64,这意味着您的模型将接收 64 个样本的块,计算每个输出(无论每个样本的时间步数是多少),平均梯度并传播它以更新参数向量.
在深入研究 [1] 和 [4] 的示例时,Jason 总是将他的时间序列拆分为仅包含 1 个时间步长的几个样本(在他的示例中完全确定了序列)。所以我认为这些批次真的是沿着samples-轴分开的。 (但是他的时间序列拆分方法对我来说对长期依赖问题没有意义。)
结论
假设我选择batch_size=10,这意味着在一个时期内,权重更新 1000 / 10 = 100 次,随机选择 10 个,包含 600 x 8 值的完整时间序列,当我稍后想用模型,我总是需要为它提供 10 个完整时间序列的批次(或使用 [4] 中的解决方案 3,将权重复制到具有不同 batch_size 的新模型)。
batch_size 的原则已了解 - 但仍不知道 batch_size 的价值是多少。以及如何确定它
有状态
KERAS documentation 告诉我们
您可以将 RNN 层设置为“有状态”,这意味着为一个批次中的样本计算的状态将被重新用作下一批中的样本的初始状态。
如果我将我的时间序列拆分为几个 samples(如 [1] 和 [4] 的示例中),那么我的依赖项想要跨多个批次建模,或者批次跨度样本彼此相关,我可能需要一个有状态的网络,否则不需要。这是一个正确而完整的结论吗?
所以对于我的问题,我想我不需要有状态的网络。我会将我的训练数据构建为形状为 (samples, timesteps, features) 的 3D 数组,然后调用 model.fit 并使用尚未确定的 batch_size。示例代码可能如下所示:
model = Sequential()
model.add(LSTM(32, input_shape=(600, 8))) # (timesteps, features)
model.add(LSTM(32))
model.add(LSTM(32))
model.add(LSTM(32))
model.add(Dense(1, activation='linear'))
model.compile(loss='mean_squared_error', optimizer='adam')
model.fit(X, y, epochs=500, batch_size=batch_size, verbose=2)
【问题讨论】:
标签: python keras lstm recurrent-neural-network