TensorFlow时间序列训练模式:输入尺寸中只能有一个为 -1,不能同时为0 和1

人工智能 2026-07-10

我在做一个关于使用TensorFlow的时间序列模型的教程时,遇到了一个与reshaping相关的错误,推测来自reshape层。

train_dataset = tf.keras.utils.timeseries_dataset_from_array(
    train_norm,
    targets=temperature_train[delay:],
    sampling_rate=sampling_rate,
    sequence_length=sequence_length,
    shuffle=True,
    batch_size=batch_size,
)

valid_dataset = tf.keras.utils.timeseries_dataset_from_array(
    valid_norm,
    targets=temperature_valid[delay:],
    sampling_rate=sampling_rate,
    sequence_length=sequence_length,
    shuffle=True,
    batch_size=batch_size,
)

for batch in train_dataset.take(1):
    inputs, label = batch
    print(inputs.shape)
    print(label.shape)
    break

打印结果是

(64, 120, 14)
(64,)

以下断言块对train_dataset和 valid_dataset没有抛出错误:

for batch in train_dataset:
    inputs, label = batch
    assert inputs.shape[1:] == (120, 14), f"{inputs.shape[1:]}"

当我建立模型并开始训练

inputs = tf.keras.Input(shape=(inputs.shape[1:]))
x = tf.keras.layers.Flatten()(inputs)
x = tf.keras.layers.Dense(16, activation="relu")(x)
outputs = tf.keras.layers.Dense(1)(x)
model = tf.keras.Model(inputs, outputs)
model.compile("adam", loss="mse", metrics=["mae"])
callbacks = [
tf.keras.callbacks.ModelCheckpoint("jena_dense.keras", save_best_only=True)]

history = model.fit(train_dataset, validation_data = valid_dataset, epochs = 15, callbacks=callbacks )

它抛出了如下错误

InvalidArgumentError: Graph execution error:

Detected at node functional_10_1/flatten_13_1/Reshape defined at (most recent call last)

...
...

Only one input size may be -1, not both 0 and 1
     [[{{node functional_10_1/flatten_13_1/Reshape}}]] [Op:__inference_multi_step_on_iterator_40343]

对于flatten层来说,输入形状不应该有歧义,这一点可以从断言测试中看出。我不知道问题出在哪里。有人能帮忙吗?

解决方案

看起来你的 valid_dataset 实际上是完全空的,因为你的验证数组太短,无法在延迟切片之后形成一个序列。这个断言块没有捕捉到这一点,因为遍历一个空数据集时循环会直接退出,而不会执行断言。请确保 len(temperature_valid[delay:]) >= sequence_length,这样flatten的错误就会消失。请告诉我这是否对你有用。谢谢!

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章