如何在 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()
我想在用于情感分类任务的 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()