TensorFlow时间序列训练模式:输入尺寸中只能有一个为 -1,不能同时为0 和1
我在做一个关于使用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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。