Je suis en train de construire un autoencodeur LSTM dans le but d'obtenir un vecteur de taille fixe à partir d'une séquence, qui représente la séquence aussi bien que possible. Cet autoencodeur se compose de deux parties :
Encodeur
LSTM : Prend une séquence et renvoie un vecteur de sortie (return_sequences = False
)Décodeur
LSTM : Prend un vecteur de sortie et renvoie une séquence (return_sequences = True
)
En fin de compte, l'encodeur est un LSTM type plusieurs à un et le décodeur est un LSTM type un à plusieurs.
Source de l'image : Andrej Karpathy
À un niveau élevé, le code ressemble à ceci (similaire à ce qui est décrit ici) :
encodeur = Model(...)
decodeur = Model(...)
autoencodeur = Model(encodeur.inputs, decodeur(encodeur(encodeur.inputs)))
autoencodeur.compile(loss='binary_crossentropy',
optimizer='adam',
metrics=['accuracy'])
autoencodeur.fit(data, data,
batch_size=100,
epochs=1500)
La forme (nombre d'exemples d'entraînement, longueur de séquence, dimension d'entrée) du tableau data
est (1200, 10, 5)
et ressemble à cela :
array([[[1, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 1, 0, 0],
...,
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
... ]
Problème : Je ne suis pas sûr de la marche à suivre, en particulier de l'intégration de LSTM
à Model
et de la façon de faire en sorte que le décodeur génère une séquence à partir d'un vecteur.
J'utilise keras
avec backend tensorflow
.
ÉDIT : Si quelqu'un veut essayer, voici ma procédure pour générer des séquences aléatoires avec des déplacements de valeurs (y compris le padding) :
import random
import math
def listePasSiAléatoire(x):
rlen = 8
rlist = [0 for x in range(rlen)]
if x <= 7:
rlist[x] = 1
return rlist
séquence = [[listePasSiAléatoire(x) for x in range(round(random.uniform(0, 10)))] for y in range(5000)]
### Padding ensuite
from keras.preprocessing import sequence as seq
data = seq.pad_sequences(
sequences = séquence,
padding='post',
maxlen=None,
truncating='post',
value=0.
)
1 votes
Pourquoi générez-vous des séquences aléatoires ?
1 votes
@lelloman : Juste à des fins de test. J'espère que pour tester ceci est suffisant. Je pense que cela devrait fonctionner de toute façon puisque cette tâche consiste à reconstruire et non vraiment à trouver des motifs.
1 votes
Je pose cette question juste par curiosité, je ne suis vraiment pas expert. Mais les autoencodeurs ne devraient-ils pas avoir besoin de modèles pour fonctionner ?
0 votes
@lelloman: Je pense que vous avez raison à la fin. Mais je supposerais aussi que, si le problème n'est pas trop important et que votre vecteur de sortie a une dimension suffisamment élevée, vous pouvez coder des séquences aléatoires sans perte importante d'informations. Mais il se pourrait que je me trompe. Espérons que nous verrons ce qu'il en est. Et mes données réelles ne sont bien sûr pas aléatoires.
0 votes
As-tu jeté un coup d'œil à ceci ?
0 votes
@lelloman : Oui, regardez à la fin de ce problème. Ils ont essayé avec
return_sequences = True
pour le codeur ce qui donne aucun vecteur de sortie significatif car les données sont reconstruites en utilisant la séquence interne.2 votes
Vous pouvez utiliser une approche
un-à-plusieurs
à partir d'ici: stackoverflow.com/questions/43034960/…