Я пытаюсь создать автообнаружение LSTM с целью получения фиксированного размера вектора из последовательности, которая представляет последовательность как можно лучше. Этот автококкер состоит из двух частей:
-
LSTM
Encoder: принимает последовательность и возвращает выходной вектор (return_sequences = False
) -
LSTM
Декодер: принимает выходной вектор и возвращает последовательность (return_sequences = True
)
Итак, в конце концов, кодер - это много к одному LSTM, а декодер - это один для многих LSTM.
На высоком уровне кодировка выглядит так (как описано здесь):
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)
Форма (количество примеров обучения, длина последовательности, размер ввода) массива data
составляет (1200, 10, 5)
и выглядит следующим образом:
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]],
... ]
Проблема: Я не уверен, как действовать, особенно, как интегрировать LSTM
в Model
и как заставить декодер генерировать последовательность из вектора.
Я использую keras
с бэкэндом tensorflow
.
EDIT: Если кто-то хочет попробовать, вот моя процедура для генерации случайных последовательностей с движущимися (включая дополнение):
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.
)