Ошибка 'Вход 0 несовместим со слоем conv1d_48: ожидаемый ndim = 3, найденный ndim = 2' при добавлении слоя Conv1D - PullRequest
0 голосов
/ 18 октября 2018

Я пытаюсь построить следующую модель:

model = Sequential()
model.add(Embedding(input_dim = num_top_words, output_dim = 64, input_length = input_length))
model.add(LSTM(100, activation = 'relu'))
model.add(Conv1D(64, kernel_size = 5, activation = 'relu'))
model.add(MaxPooling1D())
model.add(Dense(5, activation = 'softmax'))
model.compile(loss = 'categorical_crossentropy', optimizer = 'adam', metrics = ['accuracy'])

Но я получаю следующую ошибку при ее запуске:

Input 0 is incompatible with layer conv1d_48: expected ndim=3, found ndim=2

, которая указывает на ошибку вследующая строка:

model.add(Conv1D(64, kernel_size = 5, activation = 'relu'))

В чем может быть проблема?

1 Ответ

0 голосов
/ 18 октября 2018

Проблема заключается в том, что в настоящее время выходная форма слоя LSTM равна (None, 100), однако, как предполагает ошибка, слой Conv1D, такой как слой LSTM, ожидает 3D-ввод формы (None, n_steps, n_features).Таким образом, один из способов решения этой проблемы состоит в том, чтобы передать return_sequences=True слою LSTM, чтобы иметь выходные данные каждого временного шага, и, следовательно, его выходные данные были бы 3D:

model.add(LSTM(100, activation = 'relu', return_sequences=True))

В качестве альтернативы, вы можете поместить Conv1D и MaxPooling1D слоев перед слоем LSTM (что может быть даже лучше, чем текущая архитектура, поскольку одно использование Conv1D плюс объединяющие слои должно уменьшить размер входных данных слоя LSTM и, следовательно, уменьшить вычислительную сложность):

model.add(Conv1D(64, kernel_size = 5, activation = 'relu'))
model.add(MaxPooling1D())
model.add(LSTM(100, activation = 'relu'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...