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))
(...)

То же самое относится и к определениям функционального стиля, попробуйте.

Другие вопросы по тегам