Нет необходимости использовать Flatten
после LSTM
, поскольку LSTM
(по умолчанию) возвращает только состояние last , а не последовательность, т. Е. Данные будут иметь форму (BS, n_output)
, но слой Flatten
ожидает форму (BS, a, b)
, которая будет преобразована в (BS, a*b)
.
Итак, удалите слой Flatten
и работайте только с последним состоянием или добавьте return_sequences=True
к LSTM
. Это заставит LSTM
возвращать все выходы, а не только последний, т.е. (BS, T, n_out)
.
Редактировать : Кроме того, неправильный способ создания окончательной модели. Пожалуйста, посмотрите на этот пример; для вас это должно быть примерно так:
merge = Concatenate([lstm_model, cnn_model])
hidden = Dense(1, activation = 'sigmoid')
conc_model = Sequential()
conc_model.add(merge)
conc_model.add(hidden)
conc_model.compile(...)
output = conc_model .fit(X_train, y_train, epochs=3, batch_size=64)
В целом, может быть лучше использовать Функциональный API .
Редактировать 2 : это окончательный код
cnn_model = Sequential()
cnn_model.add(Embedding(top_words, embedding_vecor_length, input_length=max_review_length))
cnn_model.add(Conv1D(filters=32, kernel_size=3, padding='same', activation='relu'))
cnn_model.add(MaxPooling1D(pool_size=2))
cnn_model.add(Flatten())
lstm_model = Sequential()
lstm_model.add(Embedding(top_words, embedding_vecor_length, input_length=max_review_length))
lstm_model.add(LSTM(64, activation = 'relu', return_sequences=True))
lstm_model.add(Flatten())
# instead of the last two lines you can also use
# lstm_model.add(LSTM(64, activation = 'relu'))
# then you do not have to use the Flatten layer. depends on your actual needs
merge = Concatenate([lstm_model, cnn_model])
hidden = Dense(1, activation = 'sigmoid')
conc_model = Sequential()
conc_model.add(merge)
conc_model.add(hidden)