Autoencoder LSTM
Estou tentando criar um autoencoder LSTM com o objetivo de obter um vetor de tamanho fixo de uma sequência, que representa a sequência da melhor forma possível. Esse codificador automático consiste em duas partes:
LSTM
Codificador: obtém uma sequência e retorna um vetor de saída (return_sequences = False
)LSTM
Decodificador: pega um vetor de saída e retorna uma sequência (return_sequences = True
)Então, no final, o codificador é ummuitos para um LSTM e o decodificador é umum para muitos LSTM.
Fonte da imagem:Andrej Karpathy
Em um nível alto, a codificação fica assim (semelhante à descritaaqui):
encoder = Model(...)
decoder = Model(...)
autoencoder = Model(encoder.inputs, decoder(encoder(encoder.inputs)))
autoencoder.compile(loss='binary_crossentropy',
optimizer='adam',
metrics=['accuracy'])
autoencoder.fit(data, data,
batch_size=100,
epochs=1500)
A forma (número de exemplos de treinamento, comprimento da sequência, dimensão de entrada) dadata
matriz é(1200, 10, 5)
e fica assim:
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]],
... ]
Problema: Não sei ao certo como proceder, principalmente como integrarLSTM
paraModel
e como obter o decodificador para gerar uma sequência a partir de um vetor.
estou usandokeras
comtensorflow
back-end.
EDITAR: Se alguém quiser experimentar, aqui está o meu procedimento para gerar sequências aleatórias com as em movimento (incluindo preenchimento):
import random
import math
def getNotSoRandomList(x):
rlen = 8
rlist = [0 for x in range(rlen)]
if x <= 7:
rlist[x] = 1
return rlist
sequence = [[getNotSoRandomList(x) for x in range(round(random.uniform(0, 10)))] for y in range(5000)]
### Padding afterwards
from keras.preprocessing import sequence as seq
data = seq.pad_sequences(
sequences = sequence,
padding='post',
maxlen=None,
truncating='post',
value=0.
)