背景:
我目前正在使用Keras和Tensorflow后端进行时间序列预测,并研究了这里提供的教程。
按照这个教程,我来到了描述fit_generator()
方法的生成器的那一点。
这个生成器生成的输出如下所示(左样本,右目标):
[[[10. 15.]
[20. 25.]]] => [[30. 35.]] -> Batch no. 1: 2 Samples | 1 Target
---------------------------------------------
[[[20. 25.]
[30. 35.]]] => [[40. 45.]] -> Batch no. 2: 2 Samples | 1 Target
---------------------------------------------
[[[30. 35.]
[40. 45.]]] => [[50. 55.]] -> Batch no. 3: 2 Samples | 1 Target
---------------------------------------------
[[[40. 45.]
[50. 55.]]] => [[60. 65.]] -> Batch no. 4: 2 Samples | 1 Target
---------------------------------------------
[[[50. 55.]
[60. 65.]]] => [[70. 75.]] -> Batch no. 5: 2 Samples | 1 Target
---------------------------------------------
[[[60. 65.]
[70. 75.]]] => [[80. 85.]] -> Batch no. 6: 2 Samples | 1 Target
---------------------------------------------
[[[70. 75.]
[80. 85.]]] => [[90. 95.]] -> Batch no. 7: 2 Samples | 1 Target
---------------------------------------------
[[[80. 85.]
[90. 95.]]] => [[100. 105.]] -> Batch no. 8: 2 Samples | 1 Target
在教程中使用了TimeSeriesGenerator
,但对于我的问题来说,使用自定义生成器或者这个类都是次要的。关于数据,我们有8个steps_per_epoch和一个形状为(8,1,2,2)的样本。生成器被馈送到由LSTM实现的递归神经网络中。我的问题是:
fit_generator()
一次只允许一个目标,就像TimeSeriesGenerator
输出的那样。当我第一次了解到可以批量处理的选项时,我认为我可以有多个样本和相应数量的目标(它们按批次处理,即逐行处理)。但是fit_generator()
不允许这样做,因此显然是错误的。例如,这将看起来像:[[[10. 15. 20. 25.]]] => [[30. 35.]]
[[[20. 25. 30. 35.]]] => [[40. 45.]]
|-> Batch no. 1: 2 Samples | 2 Targets
---------------------------------------------
[[[30. 35. 40. 45.]]] => [[50. 55.]]
[[[40. 45. 50. 55.]]] => [[60. 65.]]
|-> Batch no. 2: 2 Samples | 2 Targets
---------------------------------------------
...
其次,我的想法是,例如,[10,15]和[20,25]被连续用作RNN的输入,以获得目标[30,35],这意味着这相当于输入[10,15,20,25]。由于使用第二种方法的RNN输出不同(我进行了测试),因此这也必须是一个错误的结论。因此,我的问题是:
1.为什么每个批次只允许一个目标(我知道有一些解决方法,但肯定有原因)?
2.我应该如何理解一个批次的计算?也就是说,类似[[[40,45],[50,55]]]=>[[60,65]]这样的输入是如何处理的,为什么它不能与[[[40,45,50,55]]]=>[[60,65]]类比?
#This is just a single batch - Multiple batches would be fed to fit_generator()
(array([[[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]]]),
array([[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]]))
这应该是一个包含两个长度为5的时间序列(5个连续的数据点/时间步长)及其对应序列的单个批次。 [ 5,6,7,8,9 ]
是[0,1,2,3,4]
的目标序列,而[10,11,12,13,14]
是[5,6,7,8,9]
的相应目标序列。
此样本的形状为shape(number_of_batches, number_of_elements_per_batch, sequence_size)
,目标形状为shape(number_of_elements_per_batch, sequence_size)
。
Keras看到有两个目标样本(在ValueError中),因为我需要提供3D样本作为输入和2D目标作为输出(也许我不知道如何提供3D目标..)。
无论如何,根据@todays的答案/评论,Keras将这解释为两个时间步长和五个特征。关于我的第一个问题(在其中我仍将序列视为序列的目标,例如在此处编辑示例中),我想了解是否可以实现这一点以及这样的批次会是什么样子的(就像我在问题中尝试可视化的那样)。
[10, 15]
和[20, 25]
,其中每个时间步长包含两个特征,例如10和15或20和25。此外,相应的目标由一个时间步长组成,例如[30, 35]
,它也有两个特征。换句话说,批处理中的每个输入样本都必须有一个对应的目标。但是,每个输入样本及其目标的形状可能不相同。 - todayhstack
将两个单变量时间序列并排堆叠起来构建该时间序列的原因。它只是根据前两个时间步预测下一个时间步。 - today