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
中的时间步相对应的目标。targets[i]
应该是与索引 i
处开始的窗口相对应的目标(请参见下面的示例 2)。如果您没有目标数据,请传递 None
(在这种情况下,数据集将仅生成输入数据)。s
,输出样本将从索引 data[i]
、data[i + s]
、data[i + 2 * s]
等开始。r
,时间步 data[i], data[i + r], ... data[i + sequence_length]
用于创建样本序列。None
,则数据将不进行批处理(数据集将生成单个样本)。start_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 个时间步来预测下一个时间步的数据集,您可以使用
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:用于多对多架构的时间序列回归。
考虑两个标量值数组 X
和 Y
,它们的形状均为 (100,)
。生成的数据集应包含每个样本 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
参数,或者列表中最长序列的长度。
短于 num_timesteps
的序列将用 value
填充,直到达到 num_timesteps
长度。
长于 num_timesteps
的序列将被截断,以便它们适合所需的长度。
填充或截断发生的位置由参数 padding
和 truncating
分别确定。从序列的开头进行预填充或删除值是默认设置。
>>> 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)
参数
"int32"
)。输出序列的类型。要使用可变长度字符串填充序列,可以使用 object
。"pre"
):在每个序列之前或之后填充。"pre"
):从大于 maxlen
的序列中删除值,从序列的开头或结尾删除。0.
)返回值
形状为 (len(sequences), maxlen)
的 NumPy 数组