我正在尝试实现一个LSTM with Keras。
我知道Keras中的LSTM需要一个以形状(nb_samples, timesteps, input_dim)
作为输入的3D张量。然而,我并不完全确定在我的例子中输入应该是什么样子的,因为对于每个输入,我只有一个T
观察结果的样本,而不是多个样本,即(nb_samples=1, timesteps=T, input_dim=N)
。把我的每个输入分成长度为T/M
的样本更好吗?T
对我来说大约有几百万个观测值,那么在这种情况下,每个样本应该有多长时间,即我应该如何选择M
?
还有,我说的对吗,这个张量应该看起来像:
[[[a_11, a_12, ..., a_1M], [a_21, a_22, ..., a_2M], ..., [a_N1, a_N2, ..., a_NM]],
[[b_11, b_12, ..., b_1M], [b_21, b_22, ..., b_2M], ..., [b_N1, b_N2, ..., b_NM]],
...,
[[x_11, x_12, ..., a_1M], [x_21, x_22, ..., x_2M], ..., [x_N1, x_N2, ..., x_NM]]]
其中M和N定义为之前,x对应于我从上面讨论的拆分中获得的最后一个样本?
最后,给定一个pandas数据框,每个列中都有T
个观察值,每个输入都有N
列,如何创建这样的输入以馈送给Keras?
下面是一个设置时间序列数据以训练LSTM的示例。模型输出是毫无意义的,因为我只是设置它来演示如何构建模型。
时间序列数据帧:
您可以将输入构建为向量,然后使用pandas
.cumsum()
函数构建时间序列的序列:可以以类似的方式设置输出,但它将是单个矢量而不是序列:
输入序列的长度必须相同才能在模型中运行,因此需要将它们填充为累积向量的最大长度:
训练数据可以从数据帧中提取并放入numpy数组中。请注意,从数据帧中输出的输入数据不会构成三维数组。它生成一个数组,这是不同的。
可以使用hstack和reforme来构建三维输入数组。
为了证明这一点:
一旦有了训练数据,就可以定义输入层和输出层的维度。
建立模型:
最后,您可以培训模型并将培训日志保存为历史记录:
输出:
就这样。使用
model.predict(X)
,其中X
与X_train
的格式相同(而不是样本数),以便从模型进行预测。张量形状
你说得对,Keras期望LSTM神经网络有一个三维张量,但我认为你缺少的一点是Keras期望每个观测值都有多个维度。
例如,在Keras中,我使用词向量来表示自然语言处理的文档。文档中的每个单词都由一个n维数字向量表示(因此,如果
n = 2
,“cat”一词将由类似[0.31, 0.65]
的东西表示)。为了表示单个文档,单词向量按顺序排列(例如,“cat sat.”=[[0.12, 0.99], [0.31, 0.65], [0.94, 0.04]]
)。文档将是Keras LSTM中的单个样本。这类似于你的时间序列观察。一个文档就像一个时间序列,一个单词就像你的时间序列中的一个观察,但是在你的例子中,它只是你的观察的表示只是
n = 1
维度。因此,我认为你的张量应该是
[[[a1], [a2], ... , [aT]], [[b1], [b2], ..., [bT]], ..., [[x1], [x2], ..., [xT]]]
,其中x
对应于nb_samples
,timesteps = T
,和input_dim = 1
,因为你的每个观测值只有一个数。批量大小
根据这个Cross Validated post,批大小应该设置为在不超过计算机内存容量的情况下最大化吞吐量。据我所知,您的输入不需要是批处理大小的倍数,也不需要在训练模型和根据模型进行预测时使用。
示例
如果您正在寻找示例代码,那么在Keras Github上有许多使用LSTM和其他已排序输入的网络类型的示例。
相关问题 更多 >
编程相关推荐