LSTM после вложения N-мерной последовательности
У меня есть входная последовательность с 2-х измерений train_seq
с формой (100000, 200, 2)
т.е. 100000 обучающих примеров, длина последовательности 200 и 2 функции.
Последовательности являются текстовыми, поэтому каждый элемент представляет собой одно слово со словарем в 5000 слов. Следовательно, я хочу использовать слой внедрения до моей LSTM.
MAX_SEQUENCE_LENGTH = 200
EMBEDDING_SIZE = 64
MAX_FEATURES = 5000
NUM_CATEGORIES = 5
model_input = Input(shape=(MAX_SEQUENCE_LENGTH,2))
x = Embedding(output_dim=EMBEDDING_SIZE, input_dim=MAX_FEATURES, input_length=(MAX_SEQUENCE_LENGTH,2))(model_input)
x_lstm = LSTM(64)(x)
x = Dense(128, activation='relu', name = 'lstm')(x_lstm)
output = Dense(NUM_CATEGORIES, activation='sigmoid')(x)
model = Model(inputs=[model_input], outputs=[output])
model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy'])
Однако я не могу построить модель и получить следующую ошибку:
ValueError: Input 0 is incompatible with layer lstm: expected ndim=3, found ndim=4
, Просматривая сводку модели без LSTM, я вижу, что форма вывода моего встраивания (None, 200, 2, 64)
Layer (type) Output Shape Param #
=================================================================
merged_input (InputLayer) (None, 200, 2) 0
_________________________________________________________________
embedding (Embedding) (None, 200, 2, 64) 196096
_________________________________________________________________
Обратите внимание, что эта архитектура работает, когда входная последовательность является одномерной. Может ли LSTM получить двумерную последовательность? Как мне сказать слою LSTM, что входная форма (None, 200, 2, 64)
?
Любая помощь будет оценена
2 ответа
Решение состоит в том, чтобы добавить входную форму в слой LSTM:
x_lstm = LSTM(64, input_shape=(MAX_SEQUENCE_LENGTH,2))(x)
Затем следует слой Flatten
x = Flatten()(x_lstm)
Прежде всего, не определяйте входной слой, он вам не нужен. В общем случае слой Embedding используется следующим образом:
model = Sequential()
model.add(Embedding(MAX_FEATURES, EMBEDDING_SIZE , input_length=MAX_SEQUENCE_LENGTH ))
model.add(LSTM(64))
(...)
То же самое относится и к определениям функционального стиля, попробуйте.