添加 Conv1D 层时出错'Input 0 is incompatible with layer conv1d_48: expected ndim=3, found ndim=2'



我正在尝试构建以下模型:

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'))

可能有什么问题?

问题是当前LSTM图层的输出形状是(None, 100),但是,正如错误所暗示的那样,像LSTM层这样的Conv1D层需要形状(None, n_steps, n_features)的 3D 输入。因此,解决此问题的一种方法是将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'))

相关内容

最新更新