如何确定时间序列PrefetchDataset对应的Keras输入层input_shape参数
问题原因分析
首先明确你当前数据集输入X的各维度含义:
从element_spec的输出(TensorSpec(shape=(None, None, 4, 1), dtype=tf.float64, name=None), ...)可以得到,单个批次的输入张量维度为:
- 第1位:批次大小,对应第一个
None,值为你设置的32 - 第2位:时间窗口长度,对应第二个
None,值为你设置的128 - 第3位:特征数量,固定为4
- 第4位:你在数据集生成时通过
tf.expand_dims(series, axis=-1)额外添加的维度,固定为1
你报错的核心原因有两个:
Conv1D默认接收3维输入(批次+时间步+通道数),你当前输入是4维,多了最后一个值为1的冗余维度- 你设置的
input_shape完全不符合输入结构:input_shape不需要包含批次维度,你写的4个维度会被模型判定为输入是5维张量,同时你要求最后一维为4,但实际输入最后一维是1,维度匹配失败。
解决方案
方案1:修改数据集生成代码(推荐,逻辑更简洁)
你参考的数据集生成代码是针对单特征时间序列的,你是4特征场景,不需要额外加最后一维。直接删除windowed_dataset函数里的第一行代码:
series = tf.expand_dims(series, axis=-1)
删除后数据集输入X的维度会变成(None, None, 4),正好匹配Conv1D的输入要求。此时模型第一层的Conv1D修改为:
Conv1D(filters=128, kernel_size=3, strides=1, padding='causal', input_shape=(window_size, 4) , activation='relu')
如果需要适配可变窗口大小,也可以把input_shape写成(None, 4)。
方案2:不修改数据集,仅调整模型结构
如果你不想改动现有数据集生成逻辑,可以在模型最开头加一层维度调整层,去掉冗余的最后一维,代码如下:
# 第一层先调整维度,去掉最后一个值为1的冗余维度 Reshape(target_shape=(window_size, 4), input_shape=(window_size, 4, 1)), # 后面接原来的Conv1D,不需要再写input_shape参数 Conv1D(filters=128, kernel_size=3, strides=1, padding='causal', activation='relu'),
内容的提问来源于stack exchange,提问作者CharltonZ1
相关产品推荐
相关产品推荐

