【问题标题】:ValueError: `validation_split` is only supported for Tensors or NumPy arrays, found: (keras.preprocessing.sequence.TimeseriesGenerator object)ValueError:`validation_split` 仅支持张量或 NumPy 数组,发现:(keras.preprocessing.sequence.TimeseriesGenerator 对象)
【发布时间】:2020-11-19 19:17:31
【问题描述】:

当我尝试在我的 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 数组
而且由于 TimeSeriesGenerator 是在使用 LSTM 时必须使用的,这是否意味着对于 LSTM 我们不能使用validation_split

【问题讨论】:

    标签: python tensorflow keras lstm


    【解决方案1】:
    y = np.array(y)
    

    这为我解决了问题。 报错说它只支持numpy数组,所以转成数组吧。

    【讨论】:

    • 这个答案违背了使用 tensorflow.datasets 的目的。而是按照@pratsbhatt 的建议拆分数据并使用model.fit(train_dataset , validation_data=test_dataset)
    【解决方案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)
    

    希望我的回答对你有帮助。

    【讨论】:

      猜你喜欢
      • 2020-07-05
      • 2020-09-09
      • 1970-01-01
      • 2020-12-08
      • 2020-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多