我试图构建以下模型:
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)
,然而,正如错误所提示的,Conv1D
层与LSTM
层一样,期望一个形状为(None, n_steps, n_features)
的三维输入。因此,一种解决方法是向LSTM层传递return_sequences=True
参数,以便获得每个时间步的输出,从而使其输出变为三维:
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'))