当我尝试在LSTM模型中添加validation_split时,出现此错误
ValueError: `validation_split` is only supported for Tensors or NumPy arrays, found: (<tensorflow.python.keras.preprocessing.sequence.TimeseriesGenerator object)
这是代码
from keras.preprocessing.sequence import TimeseriesGenerator
train_generator = TimeseriesGenerator(df_scaled, df_scaled, length=n_timestamp, batch_size=1)
model.fit(train_generator, epochs=50,verbose=2,callbacks=[tensorboard_callback], validation_split=0.1)
----------
ValueError: `validation_split` is only supported for Tensors or NumPy arrays, found: (<tensorflow.python.keras.preprocessing.sequence.TimeseriesGenerator object)
我能想到的一个原因是,使用 validation_split 是一个张量或numpy数组,正如错误所提到的那样,但是,当通过 TimeSeriesGenerator 传递训练数据时,它将火车数据的尺寸更改为3D数组
而且由于在使用LSTM时必须使用 TimeSeriesGenerator ,因此对于LSTM而言,这意味着我们不能使用validation_split
答案 0 :(得分:2)
您的第一个直觉是正确的,即在使用数据集生成器时不能使用validation_split
。
您将必须了解dataset
生成器的功能如何发生。 model.fit
API不知道您的数据集在第一个时期有多少条记录或批处理。每次为每个批次生成或提供数据时,都要对模型进行训练。因此,API根本无法知道最初有多少记录,然后再进行验证。由于这个原因,在使用数据集生成器时不能使用validation_split
。您可以在他们的documentation中阅读它。
在0到1之间浮动。训练数据的小数部分用作 验证数据。该模型会将这部分 训练数据,将不会对其进行训练,并将评估损失和 在每个时期结束时,此数据的任何模型指标。的 从x和y数据中的最后一个样本中选择验证数据 提供,洗牌之前。 x为a时不支持此参数 数据集,生成器或keras.utils.Sequence实例。
您需要阅读最后两行,他们说数据集生成器不支持该行。
您可以使用以下代码来拆分数据集。您可以详细阅读here。我只是从下面的链接中写出重要的部分。
# Splitting the dataset for training and testing.
def is_test(x, _):
return x % 4 == 0
def is_train(x, y):
return not is_test(x, y)
recover = lambda x, y: y
# Split the dataset for training.
test_dataset = dataset.enumerate() \
.filter(is_test) \
.map(recover)
# Split the dataset for testing/validation.
train_dataset = dataset.enumerate() \
.filter(is_train) \
.map(recover)
希望我的回答对您有所帮助。