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

时间序列数据加载

[源]

timeseries_dataset_from_array 函数

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 张量。轴 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:可选的 int;用于打乱的随机种子。
  • start_index:可选的 int;早于(不含)start_index 的数据点将不会用于输出序列。这对于保留部分数据用于测试或验证很有用。
  • end_index:可选的 int;晚于(不含)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 个时间步预测下一个时间步的数据集,您可以使用:

input_data = data[:-10]
targets = data[10:]
dataset = timeseries_dataset_from_array(
    input_data, targets, sequence_length=10)
for batch in dataset:
  inputs, targets = batch
  assert np.array_equal(inputs[0], data[:10])  # First sequence: steps [0-9]
  # Corresponding target: step 10
  assert np.array_equal(targets[0], data[10])
  break

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

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

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

sample_length = 20
input_dataset = timeseries_dataset_from_array(
    X, None, sequence_length=sample_length, sequence_stride=sample_length)
target_dataset = 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

[源]

pad_sequences 函数

keras.utils.pad_sequences(
    sequences, maxlen=None, dtype="int32", padding="pre", truncating="pre", value=0.0
)

将序列填充到相同长度。

此函数将一个序列列表(长度为 num_samples,序列为整数列表)转换为形状为 (num_samples, num_timesteps) 的 2D NumPy 数组。num_timesteps 如果提供了 maxlen 参数,则为 maxlen 的值,否则为列表中最长序列的长度。

短于 num_timesteps 的序列会用 value 进行填充,直到达到 num_timesteps 的长度。

长于 num_timesteps 的序列会被截断,使其符合所需长度。

填充或截断发生的位置分别由参数 paddingtruncating 决定。默认是在序列开头进行前填充或删除值。

>>> sequence = [[1], [2, 3], [4, 5, 6]]
>>> keras.utils.pad_sequences(sequence)
array([[0, 0, 1],
       [0, 2, 3],
       [4, 5, 6]], dtype=int32)
>>> keras.utils.pad_sequences(sequence, value=-1)
array([[-1, -1,  1],
       [-1,  2,  3],
       [ 4,  5,  6]], dtype=int32)
>>> keras.utils.pad_sequences(sequence, padding='post')
array([[1, 0, 0],
       [2, 3, 0],
       [4, 5, 6]], dtype=int32)
>>> keras.utils.pad_sequences(sequence, maxlen=2)
array([[0, 1],
       [2, 3],
       [5, 6]], dtype=int32)

参数

  • sequences:序列列表(每个序列是一个整数列表)。
  • maxlen:可选的 Int,所有序列的最大长度。如果未提供,序列将被填充到单个最长序列的长度。
  • dtype:(可选,默认为 "int32")。输出序列的类型。要填充变长字符串序列,可以使用 object
  • padding:字符串,"pre" 或 "post"(可选,默认为 "pre"):在每个序列之前或之后填充。
  • truncating:字符串,"pre" 或 "post"(可选,默认为 "pre"):从大于 maxlen 的序列中移除值,可以在序列的开头或结尾。
  • value:浮点数或字符串,填充值。(可选,默认为 0.

返回值

形状为 (len(sequences), maxlen) 的 NumPy 数组