Ввод переменной длины для автоэнкодера LSTM- Keras - PullRequest
0 голосов
/ 20 сентября 2019

Я пытаюсь модель автоэнкодера со слоями LSTM в Keras для обнаружения текстовых выбросов.Я закодировал каждое предложение в последовательность чисел, где каждое число представляет букву.

До сих пор я уже обучил модель с входом фиксированной длины, дополняя нули каждой из 4000 последовательностей доmaxlength = 40, таким образом, обучая модель с помощью массива [4000,40,1] ([batch_size, timesteps, features]).

Теперь мне интересно, как я могу использовать такую ​​модель автоэнкодера без дополнения нулями докаждая последовательность (предложение), таким образом, обучается и предсказывает фактический размер каждого предложения (последовательности).

В настоящий момент я стандартизировал каждую последовательность, поэтому мои данные поезда (x_train) представляют собой список массивов и каждый массив всписок представляет собой стандартизированную последовательность чисел различной длины.

Для ввода этих данных в модель LSTM я пытаюсь преобразовать в трехмерный массив:

x_train=np.reshape(x_train, (len(x_train), 1, 1))

, не уверен, что это правильнохотя.

Моя модель выглядит следующим образом (я удалил параметр input_shape, чтобы модель могла принимать переменную длинуinput):


model = Sequential()
model.add(LSTM(20, activation='tanh',return_sequences=True))
model.add(LSTM(15, activation='tanh', return_sequences=True))
model.add(LSTM(5, activation='tanh', return_sequences=True))
model.add(LSTM(15, activation='tanh', return_sequences=True))
model.add(LSTM(20, activation='tanh', return_sequences=True))
model.add((Dense(1,activation='tanh')))

Затем при попытке скомпилировать и обучить модель

nb_epoch = 10
model.compile(optimizer='rmsprop', loss='mse')
checkpointer = ModelCheckpoint(filepath="text_model.h5",
                               verbose=0,
                               save_best_only=True)

es_callback = keras.callbacks.EarlyStopping(monitor='val_loss')

history = model.fit(x_train, x_train,
                    epochs=nb_epoch,
                    shuffle=True,
                    validation_data=(x_test, x_test),
                    verbose=0,
                    callbacks=[checkpointer,es_callback])

Я получаю сообщение об ошибке: «ValueError: установка элемента массива с последовательностью.»

Моя сводная модель выглядит следующим образом:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
lstm_6 (LSTM)                (None, 1, 20)             1760      
_________________________________________________________________
lstm_7 (LSTM)                (None, 1, 15)             2160      
_________________________________________________________________
lstm_8 (LSTM)                (None, 1, 5)              420       
_________________________________________________________________
lstm_9 (LSTM)                (None, 1, 15)             1260      
_________________________________________________________________
lstm_10 (LSTM)               (None, 1, 20)             2880      
_________________________________________________________________
dense_2 (Dense)              (None, 1, 1)              21        
=================================================================
Total params: 8,501
Trainable params: 8,501
Non-trainable params: 0
_________________________________________________________________

Поэтому мой вопрос заключается в том, можно ли обучать и прогнозировать с помощью входной последовательности переменной длины в модели автоэнкодера LSTM.

И если моймыслительный процесс обнаружения текстовых выбросов с использованием такой модели архитектуры является правильным.

1 Ответ

1 голос
/ 20 сентября 2019

Заполнение все еще должно быть сделано так, чтобы вход мог быть трехмерным массивом (тензор), но Keras фактически обеспечивает слой masking для вас, чтобы игнорировать дополненные 0 во входном тензоре.Чтобы на модель не влияли прокладки.

from keras.models import Sequential
from keras.layers import LSTM, Dense, Masking

model = Sequential()
model.add(Masking(mask_value=0.0, input_shape=(timesteps, features)))
model.add(LSTM(20, activation='tanh',return_sequences=True))
model.add(LSTM(15, activation='tanh', return_sequences=True))
model.add(LSTM(5, activation='tanh', return_sequences=True))
model.add(LSTM(15, activation='tanh', return_sequences=True))
model.add(LSTM(20, activation='tanh', return_sequences=True))
model.add((Dense(1,activation='tanh')))
...