timeseries_dataset_from_array
functionkeras.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: 可选的整数;打乱的随机种子.
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
,数据集将生成由以下索引组成的序列批次:
第一个序列: [0 2 4 6 8 10 12 14 16 18]
第二个序列: [3 5 7 9 11 13 15 17 19 21]
第三个序列: [6 8 10 12 14 16 18 20 22 24]
...
最后一个序列: [78 80 82 84 86 88 90 92 94 96]
在这种情况下,最后 2 个数据点被丢弃,因为没有完整的序列 可以生成以包含它们(下一个序列将从索引 81 开始,因此其最后一个步骤将超过 98).
示例 2: 时间序列回归.
考虑一个标量值数组 data
,形状为 (steps,)
.
要生成一个使用过去 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]) # 第一个序列: 步骤 [0-9]
# 对应的目标: 步骤 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])
# 第二个样本等于输出时间戳 20-40
assert np.array_equal(targets[1], Y[sample_length:2*sample_length])
break
pad_sequences
functionkeras.utils.pad_sequences(
sequences, maxlen=None, dtype="int32", padding="pre", truncating="pre", value=0.0
)
填充序列至相同长度.
此函数将一个长度为 num_samples
的序列列表(整数列表)
转换为一个形状为 (num_samples, num_timesteps)
的二维 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)
参数:
sequences: 序列列表(每个序列是整数列表).
maxlen: 可选的整数,所有序列的最大长度.如果未提供,
序列将被填充到最长序列的长度.
dtype: (可选,默认为 "int32"
).输出序列的类型.
要填充具有可变长度字符串的序列,可以使用 object
.
padding: 字符串,"pre" 或 "post"(可选,默认为 "pre"
):
在每个序列之前或之后填充.
truncating: 字符串,"pre" 或 "post"(可选,默认为 "pre"
):
从序列中移除大于
maxlen
的值,分别在序列的开头或结尾.
value: 浮点数或字符串,填充值.(可选,默认为 0.
)
返回:
形状为 (len(sequences), maxlen)
的 NumPy 数组