web-dev-qa-db-fra.com

ValueError: `validation_split` est uniquement pris en charge pour les tenseurs ou les tableaux numpus, trouvé: (keras.preprocessing.Suce.timeeriesGenerator Object)

Quand j'ai essayé d'ajouter validation_split dans mon modèle LSTM, j'ai eu cette erreur

ValueError: `validation_split` is only supported for Tensors or NumPy arrays, found: (<tensorflow.python.keras.preprocessing.sequence.TimeseriesGenerator object)

Ceci est le code

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)

Une des raisons pour lesquelles je pourrais penser est, d'utiliser validation_split Un tunensor ou une matrice numpue est attendue, comme indiqué dans l'erreur, cependant, lors du passage des données de train via TimesheriesGenerator, il change la dimension des données de train vers un tableau 3D
Et depuis TimesheriesGenerator est obligatoire à être utilisé lors de l'utilisation de LSTM, cela signifie-t-il pour LSTM que nous ne pouvons pas utiliser validation_split

2
Juspreet 51

Votre première intuition est correcte que vous ne pouvez pas utiliser le validation_split Lorsque vous utilisez Generator DataSet.

Vous devrez comprendre comment le générateur de fonctionnaire de dataset se produit. Le model.fit API ne sait pas combien d'enregistrements ni de lot votre jeu de données dans sa première époque. Comme les données sont générées ou fournies pour chaque lot un à la fois du modèle de formation. Donc, il n'ya aucun moyen de savoir à l'API de savoir combien d'enregistrements sont initialement là et de faire une validation en définition. En raison de cette raison, vous ne pouvez pas utiliser le validation_split Lorsque vous utilisez Generator DataSet. Vous pouvez le lire dans leur documentation .

Flotter entre 0 et 1. La fraction des données de formation à utiliser comme données de validation. Le modèle mettra en séparation de cette fraction des données de formation, ne sera pas formé dessus et évaluera la perte et les métriques de modèle sur ces données à la fin de chaque époque. Les données de validation sont sélectionnées dans les derniers échantillons des données X et Y fournies avant de se dépasser. Cet argument n'est pas pris en charge lorsque X est une instance de jeu de données, de générateur ou de keras.utils.Suce.

Vous devez lire les deux dernières lignes où ils ont dit qu'il n'est pas pris en charge pour Generator DataSet.

Ce que vous pouvez plutôt faire est d'utiliser le code suivant pour scinder le jeu de données. Vous pouvez lire en détail ici . Je suis juste en train d'écrire la partie importante du lien ci-dessous.

# 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)

J'espère que ma réponse vous aide.

2
Prateek Bhatt