【发布时间】:2019-10-07 08:05:21
【问题描述】:
上下文:
我目前正在使用带有 Tensorflow 后端的 Keras 进行时间序列预测,因此研究了 here 提供的教程。
按照本教程,我开始描述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() 的批处理选项时,我认为我可以有多个样本和相应数量的目标(它们是批量处理的,即逐行处理)。但是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] 被连续用作目标 [30, 35] 的 RNN 的输入,这意味着这类似于输入 [10, 15、20、25]。由于使用第二种方法(我测试过)时 RNN 的输出不同,这也一定是一个错误的结论。
因此,我的问题是:
- 为什么每批只允许一个目标(我知道有一些 解决方法,但必须有原因)?
- 我如何理解
一批计算?意思是,像
[[[40, 45], [50, 55]]] => [[60, 65]]这样的输入是如何处理的,为什么它不类似于[[[40, 45, 50, 55]]] => [[60, 65]]
根据今天的答案编辑
由于对我对样本和目标的定义存在一些误解 - 我遵循我理解的 Keras 在说时试图告诉我的内容:
ValueError:输入数组的样本数应与目标数组相同。找到 1 个输入样本和 2 个目标样本。
当我创建一个看起来像这样的批处理时,就会发生这个错误:
#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 看到 2 个目标样本(在 ValueError 中),因为我有两个提供 3D 样本作为输入和 2D 目标作为输出(也许我只是不知道如何提供 3D 目标..)。
无论如何,根据@todays answer/cmets,这被 Keras 解释为两个时间步长和五个特征。关于我的第一个问题(我仍然看到一个序列作为我的序列的目标,如在这个编辑示例中),我寻求信息如何/如果我能实现这一点以及这样一个批次的外观(就像我试图在问题)。
【问题讨论】:
-
您能否澄清一下“每批单个目标”的含义?您的模型可以有一个或多个输出层,并且这些层中的每一个都可以有不同的输出形状。所以我不明白你在这里所说的“单一目标”是什么意思。请详细说明。
-
我更新了我的问题 - 你现在更清楚了吗?
-
不幸的是,没有。我认为您正在混合样本、时间步长、特征和目标。让我描述一下我是如何理解它的:在您提供的第一个示例中,似乎每个输入样本都包含 2 个 timesteps,例如
[10, 15]和[20, 25],其中每个时间步由两个特征组成,例如10 和 15 或 20 和 25。此外,相应的目标由一个时间步长组成,例如[30, 35],它也有两个特点。换句话说,批次中的每个输入样本必须有一个对应的目标。但是每个输入样本的形状和它的目标可能不一样。 -
这显然是一个多变量时间序列:每个时间步长有多个(在本例中为两个)特征。这就是为什么作者使用
hstack通过并排堆叠两个单变量时间序列来构造该时间序列的原因。它只是在给定前两个时间步长的情况下预测下一个时间步长。 -
从该教程中引用:“每个样本将是一个由 [1, 2, 2] 组成的 1 个样本、2 个时间步长和 2 个特征或平行序列的三维数组。输出将是 1 个样本和 2 个特征的二维序列 [1, 2]。”这证实了我的假设和解释。
标签: python tensorflow keras generator recurrent-neural-network