ValueError:仅对Tensors或NumPy数组支持`validation_split`(keras.preprocessing.sequence.TimeseriesGenerator对象)

时间:2020-07-30 04:59:50

标签: python tensorflow keras lstm

当我尝试在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

1 个答案:

答案 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)

希望我的回答对您有所帮助。