LSTM после вложения N-мерной последовательности - PullRequest
0 голосов
/ 10 января 2019

У меня есть входная последовательность с 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 ]

0 голосов
/ 15 января 2019

Решение заключается в добавлении входной фигуры в слой LSTM:

x_lstm = LSTM(64, input_shape=(MAX_SEQUENCE_LENGTH,2))(x)

Затем следует слой Flatten

x = Flatten()(x_lstm)
0 голосов
/ 10 января 2019

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

model = Sequential()
model.add(Embedding(MAX_FEATURES, EMBEDDING_SIZE , input_length=MAX_SEQUENCE_LENGTH ))
model.add(LSTM(64))
(...)

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

...