Ввести переменную длину в LSTM - PullRequest
0 голосов
/ 04 ноября 2018

Мои входные данные состоят из списка списка. Оба списка имеют динамическую длину для каждого примера, как показано ниже.

X[0] = [[0, 1, 3, 5, 8, 26], [3, 4, 5, 7, 9, 15, 26, 30, 38, 39, 40]]
X[1] = [[1, 2, 4, 16, 19, 29, 48]]
..

Мои целевые данные состоят из списка динамической длины, как показано ниже: (У каждого целевого даха есть только один список, НЕ СПИСОК СПИСКОВ, но длина списка может быть разной)

y[0] = [5, 7, 8, 12, 15, 17, 29]
y[1] = [2, 4, 6, 8, 10, 11, 16, 18, 19, 29, 30, 33, 35]
..

Я пытаюсь обучить модель LSTM с заданным вводом X, прогноз Y.

Если я объединю каждый список X в один список и выполняю операцию заполнения, LSTM принимает этот тип данных. Мой пример кода ниже:

X_train = sequence.pad_sequences(X_train, maxlen=padding_size)
X_test = sequence.pad_sequences(X_test, maxlen=padding_size)

model = Sequential()
model.add(Embedding(50, 10, input_length=X_train.shape[1], mask_zero=True))

if isBidirectional:
    model.add(Bidirectional(LSTM(lstm_layer_number)))
else:
    model.add(LSTM(lstm_layer_number))

if isDropout:
    model.add(Dropout(0.5))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) # binary crossentropy yields the best results

Проблема в том, что я не хочу вводить как вектор фиксированного размера. Вместо заданного вектора фиксированного размера, я хочу дать входные данные в виде динамического размера и список за списком.

Как я могу передать эти входные данные как последовательность (список за списком) в LSTM?

Любая помощь приветствуется.

...