如何在 Bi-LSTM 层之前添加 CNN 层

How do I add a CNN layer before Bi-LSTM layer

我想在用于情感分类任务的 Bi-LSTM 层之前添加一个带最大池化的 CNN 层,但出现错误。

这是我正在使用的代码。

model = Sequential()
model.add(Embedding(max_words, 30, input_length=max_len))
model.add(BatchNormalization())
model.add(Activation('tanh'))
model.add(Dropout(0.5))
model.add(Conv1D(32, kernel_size=3, activation='relu'))
model.add(GlobalMaxPooling1D())
model.add(Flatten())
model.add(Bidirectional(LSTM(32, return_sequences=True)))
model.add(BatchNormalization())
model.add(Activation('tanh'))
model.add(Dropout(0.8))
model.add(Dense(1, activation='sigmoid'))
model.summary()

这是我遇到的错误

ValueError                                Traceback (most recent call last)
<ipython-input-64-49cde447597a> in <module>()
      6 model.add(Conv1D(32, kernel_size=3, activation='relu'))
      7 model.add(GlobalMaxPooling1D())
----> 8 model.add(Flatten())
      9 model.add(Bidirectional(LSTM(32, return_sequences=True)))
     10 model.add(BatchNormalization())

2 frames
/usr/local/lib/python3.6/dist-packages/keras/engine/base_layer.py in assert_input_compatibility(self, inputs)
    356                                      self.name + ': expected min_ndim=' +
    357                                      str(spec.min_ndim) + ', found ndim=' +
--> 358                                      str(K.ndim(x)))
    359             # Check dtype.
    360             if spec.dtype is not None:

ValueError: Input 0 is incompatible with layer flatten_3: expected min_ndim=3, found ndim=2

这就是我的建议...删除扁平化和全局池化以保持 3d 格式的嵌入并正确适合 LSTM。我还将 return 序列设置为 False 因为你是一个情感分类器并假设你的输出是 2D

max_words = 111
max_len = 50

model = Sequential()
model.add(Embedding(max_words, 30, input_length=max_len))
model.add(SpatialDropout1D(0.5))
model.add(Conv1D(32, kernel_size=3, activation='relu'))
model.add(Bidirectional(LSTM(32, return_sequences=False)))
model.add(BatchNormalization())
model.add(Activation('tanh'))
model.add(Dropout(0.5))
model.add(Dense(1, activation='sigmoid'))
model.summary()