Réseau de neurones LSTM d'entrée de forme à partir d'un dataframe
Je suis en train de mettre en œuvre un LSTM avec Keras.
Je sais que LSTM en Keras nécessitent une 3D tenseur de la forme de la (nb_samples, timesteps, input_dim)
comme une entrée. Cependant, je ne suis pas entièrement sûr de savoir comment l'entrée devrait ressembler dans mon cas, comme je viens d'un échantillon de T
observations pour chaque entrée, pas de multiples échantillons, c'est à dire (nb_samples=1, timesteps=T, input_dim=N)
. Est-il préférable de diviser chacune de mes entrées dans les échantillons de longueur T/M
? T
est autour de quelques millions d'observations pour moi, combien de temps doit chaque échantillon, dans ce cas, c'est à dire, comment pourrais-je choisir M
?
Aussi, ai-je le droit, en ce que ce tenseur devrait ressembler à quelque chose comme:
[[[a_11, a_12, ..., a_1M], [a_21, a_22, ..., a_2M], ..., [a_N1, a_N2, ..., a_NM]],
[[b_11, b_12, ..., b_1M], [b_21, b_22, ..., b_2M], ..., [b_N1, b_N2, ..., b_NM]],
...,
[[x_11, x_12, ..., a_1M], [x_21, x_22, ..., x_2M], ..., [x_N1, x_N2, ..., x_NM]]]
où M et N définis comme précédemment et x correspond à la dernière échantillon que j'aurais obtenu à partir de fractionnement comme indiqué ci-dessus?
Enfin, compte tenu d'une pandas dataframe avec T
observations dans chaque colonne, et N
colonnes, une pour chaque entrée, comment puis-je créer une entrée pour nourrir Keras?
- Pourriez-vous ajouter un exemple de jeu de données pour vous remettre en question, s'il vous plaît? Parce qu'il n'est pas clair quel est l'enchaînement des entrées de créer ce genre de sortie cible dans votre modèle.
- Pouvez-vous expliquer ce qu'est le format ou le type de données pour une observation? Est-il une valeur numérique unique, un ensemble de valeurs, ou quelque chose d'autre?
Vous devez vous connecter pour publier un commentaire.
Ci-dessous est un exemple qui met en place des données de séries chronologiques pour former un LSTM. La sortie du modèle est absurde que je ne le configurer pour montrer comment construire le modèle.
Temps de la série dataframe:
Vous pouvez construire mettre entrées dans un vecteur, puis utilisez les pandas
.cumsum()
fonction pour construire la séquence de la série chronologique:La sortie peut être configuré de manière similaire, mais il sera un vecteur unique au lieu d'une séquence:
L'entrée séquences doivent être de la même longueur pour les exécuter à travers le modèle, de sorte que vous besoin de pad à être la longueur maximum de votre cumulatif vecteurs:
De formation les données peuvent être extraites à partir du dataframe et de mettre en tableaux numpy. Noter que les données d'entrée qui sort de l'dataframe ne sera pas de faire un tableau 3D. Il fait un tableau de tableaux, ce qui n'est pas la même chose.
Vous pouvez utiliser hstack et remodeler à construire une 3D d'entrée de gamme.
Pour le prouver:
Une fois que vous avez données d'entraînement vous pouvez définir les dimensions de votre couche d'entrée et de sortie des couches.
Construire le modèle:
Finalement, vous pouvez former le modèle et enregistrer le journal d'entraînement, comme l'histoire:
De sortie:
Que c'est. Utilisation
model.predict(X)
oùX
est le même format (autres que le nombre d'échantillons) commeX_train
pour faire des prédictions du modèle.expected lstm_input_1 to have shape (None, 405, 13) but got array with shape (102, 102, 13)
[405 est la longueur de mon train, 13 est mon numéro de X entrées, 102 est la longueur de mon testset]. J'ai généré le test de X de la même manière que vous l'avez fait pour le train X. savez-vous ce que je fais mal?validation_split = 0.25
à votrefit()
appel, puis Keras utilisera automatiquement de 25% de vos dossiers comme les données de validation. Si vous ne que vous n'avez pas à fractionner vos données.# Save it as a list padded_sequences = pad_sequences(df.cumulative_input_vectors.tolist(), max_sequence_length).tolist() df['padded_input_vectors'] = pd.Series(padded_sequences).apply(np.asarray)
mon collier de la séquence de zéros, alors que le cumul a les valeurs de droite? J'ai essayé avec différentes tailles de max_sequence_lengthpad_sequences
va mettre les valeurs réelles à la fin du tableau et ajouter des zéros pour les données réelles.df.loc[0,['cumulative_input_vectors', 'padded_input_vectors']]
:cumulative_input_vectors [[0.00154294032023, 0.992925949858, 1.0, 0.408... padded_input_vectors [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] Name: 0, dtype: object
pad_sequences
, plus précisément ledf.cumulative_input_vectors.tolist()
Il donne une erreur de la Mémoire. Aussi, lorsque seulement l'exécution de la tolist (), il a fallu presque 1 heure de course et consommés jusqu'à 12 go de ram que j'ai dû annuler. Que faire?rolling
objet pour créer un rouleau à la fenêtre d'une façon similaire? J'ai besoin d'un mobile de la fenêtre au lieu d'une somme cumulative.Tenseur forme
Vous avez raison, Keras s'attend à une 3D tenseur pour un LSTM réseau de neurones, mais je pense que la pièce qui vous manque, c'est que Keras s'attend à ce que chaque observation peut avoir plusieurs dimensions.
Par exemple, dans Keras, j'ai utilisé le mot vecteurs pour représenter des documents de traitement de la langue naturelle. Chaque mot dans le document est représenté par un n-dimensions numérique vecteur (donc si
n = 2
le mot "chat" serait représenté par quelque chose comme[0.31, 0.65]
). Pour représenter un seul document, le mot vecteurs sont alignés dans l'ordre (par exemple, " Le chat assis.' =[[0.12, 0.99], [0.31, 0.65], [0.94, 0.04]]
). Un document serait un seul échantillon dans un Keras LSTM.Ceci est analogue à la série temporelle des observations. Un document, c'est comme un moment de la série, et d'un mot est comme une seule observation dans votre temps de la série, mais dans votre cas, c'est juste que la représentation de votre observation est juste
n = 1
dimensions.À cause de cela, je pense que votre tenseur doit être quelque chose comme
[[[a1], [a2], ... , [aT]], [[b1], [b2], ..., [bT]], ..., [[x1], [x2], ..., [xT]]]
, oùx
correspond ànb_samples
,timesteps = T
, etinput_dim = 1
, parce que chacun de vos observations est qu'un numéro.La taille des lots
Taille de lot doit être définie afin de maximiser le débit sans dépasser la capacité de la mémoire sur votre machine, par ce Croix Validé post. Pour autant que je sais que votre entrée n'a pas besoin d'être un multiple de la taille des lots, ni lors de la formation du modèle et de faire des prédictions à partir d'elle.
Exemples
Si vous êtes à la recherche pour le code d'exemple, sur la Keras Github il y a un certain nombre d'exemples à l'aide de LSTM et d'autres types de réseau qui ont séquencé d'entrée.
nb_samples
, comme je l'ai vu jeter des messages d'erreur à ce sujet, ce qui rend les choses beaucoup plus difficile. J'ai vu des exemples que vous pouvez lier à l'avant, mais ils ne sont pas vraiment pour timeseries et plusieurs entrées, et que vraiment, il est beaucoup plus difficile (vous verrez quand vous y essayer). Pourriez-vous me donner un exemple, même si c'est un basique, en utilisant par exemple les SKLearn Boston dataset?