Keras 2 API 文档 / 数据加载 / 时间序列数据加载

时间序列数据加载

[源代码]

timeseries_dataset_from_array 函数

tf_keras.utils.timeseries_dataset_from_array(
    data,
    targets,
    sequence_length,
    sequence_stride=1,
    sampling_rate=1,
    batch_size=128,
    shuffle=False,
    seed=None,
    start_index=None,
    end_index=None,
)

根据提供的数组时间序列创建滑动窗口数据集。

该函数接收一个由相等时间间隔收集的数据点序列,以及时间序列参数(如序列/窗口的长度、两个序列/窗口之间的间隔等),以生成时间序列输入和目标值的批次。

参数

  • data: 包含连续数据点(时间步)的 Numpy 数组或 eager tensor。预期第 0 轴为时间维度。
  • targets: 与 data 中的时间步相对应的目标值。targets[i] 应该是与索引为 i 的窗口对应的目标值(参见下面的示例 2)。如果不存在目标数据,请传 None(在这种情况下,数据集将仅产生输入数据)。
  • sequence_length: 输出序列的长度(以时间步为单位)。
  • sequence_stride: 相邻输出序列之间的间隔。对于步长 s,输出样本将从索引 data[i]data[i + s]data[i + 2 * s] 等开始。
  • sampling_rate: 序列内相邻时间步之间的间隔。对于采样率 r,时间步 data[i], data[i + r], ... data[i + sequence_length] 将用于创建样本序列。
  • batch_size: 每个批次中的时间序列样本数量(最后一个批次除外)。如果为 None,数据将不会被分批(数据集将产生单个样本)。
  • shuffle: 是否对输出样本进行随机排序,或者按时间顺序提取它们。
  • seed: 可选的整数;用于随机排序的种子。
  • start_index: 可选的整数;早于 start_index(不包含)的数据点不会在输出序列中使用。这有助于预留部分数据用于测试或验证。
  • end_index: 可选的整数;晚于 end_index(不包含)的数据点不会在输出序列中使用。这有助于预留部分数据用于测试或验证。

返回

一个 tf.data.Dataset 实例。如果传入了 targets,则数据集将产生元组 (batch_of_sequences, batch_of_targets)。如果未传入,则数据集仅产生 batch_of_sequences

示例 1

考虑索引 [0, 1, ... 98]。当 sequence_length=10, sampling_rate=2, sequence_stride=3, shuffle=False 时,数据集将产生由以下索引组成的序列批次

First sequence:  [0  2  4  6  8 10 12 14 16 18]
Second sequence: [3  5  7  9 11 13 15 17 19 21]
Third sequence:  [6  8 10 12 14 16 18 20 22 24]
...
Last sequence:   [78 80 82 84 86 88 90 92 94 96]

在此情况下,最后 2 个数据点被丢弃,因为无法生成包含它们的完整序列(下一个序列将从索引 81 开始,因此其最后一个时间步将超过 98)。

示例 2:时间回归。

考虑一个形状为 (steps,) 的标量值数组 data。要生成一个使用过去 10 个时间步来预测下一个时间步的数据集,您可以使用

data = tf.range(15)
sequence_length = 10
input_data = data[:]
targets = data[sequence_length:]
dataset = tf.keras.utils.timeseries_dataset_from_array(
    input_data, targets, sequence_length=sequence_length
)
for batch in dataset:
  inputs, targets = batch
  # First sequence: steps [0-9]
  assert np.array_equal(inputs[0], data[:sequence_length])
  # Corresponding target: step 10
  assert np.array_equal(targets[0], data[sequence_length])
  break
# To view the generated dataset
for batch in dataset.as_numpy_iterator():
  input, label = batch
  print(f"Input:{input}, target:{label}")

示例 3:用于多对多架构的时间回归。

考虑两个形状都为 (100,) 的标量值数组 XY。生成的数据集应包含每个具有 20 个时间戳的样本。样本不应重叠。要生成一个使用当前时间步来预测相应目标时间步的数据集,您可以使用

X = np.arange(100)
Y = X*2

sample_length = 20
input_dataset = tf.keras.utils.timeseries_dataset_from_array(
    X, None, sequence_length=sample_length, sequence_stride=sample_length)
target_dataset = tf.keras.utils.timeseries_dataset_from_array(
    Y, None, sequence_length=sample_length, sequence_stride=sample_length)

for batch in zip(input_dataset, target_dataset):
    inputs, targets = batch
    assert np.array_equal(inputs[0], X[:sample_length])

    # second sample equals output timestamps 20-40
    assert np.array_equal(targets[1], Y[sample_length:2*sample_length])
    break