I have a problem. I want to use LSTM
inside my CNN
for a NLP problem. But unfortunately what I got is the following error ValueError: Input 0 of layer "conv1d_37" is incompatible with the layer: expected min_ndim=3, found ndim=2. Full shape received: (None, 128)
. How can I use the LSTM layer?
from keras.models import Sequential
from keras.layers import Input, Embedding, Dense, GlobalMaxPooling1D, Conv2D, MaxPool2D, LSTM, Bidirectional, Lambda, Conv1D, MaxPooling1D, GlobalMaxPooling1D
model_lstm = Sequential()
model_lstm.add(
Embedding(vocab_size
,embed_size
,weights = [embedding_matrix] #Supplied embedding matrix created from glove
,input_length = maxlen
,trainable=True)
)
model_lstm.add(SpatialDropout1D(rate = 0.4))
model_lstm.add(Conv1D(256, 7, activation="relu"))
model_lstm.add(MaxPooling1D())
model_lstm.add(LSTM(128, dropout=0.2, recurrent_dropout=0.2))
model_lstm.add(Conv1D(128, 5, activation="relu"))
model_lstm.add(MaxPooling1D())
model_lstm.add(GlobalMaxPooling1D())
model_lstm.add(Dropout(0.3))
model_lstm.add(Dense(128, activation="relu")))
model_lstm.add(Dense(4, activation='softmax'))
print(model_lstm.summary())
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
Input In [481], in <cell line: 25>()
23 model_lstm.add(MaxPooling1D())
24 model_lstm.add(LSTM(128, dropout=0.2, recurrent_dropout=0.2))
---> 25 model_lstm.add(Conv1D(128, 5, activation="relu"))
26 model_lstm.add(MaxPooling1D())
27 #model_lstm.add(Flatten())
File ~\Anaconda3\lib\site-packages\tensorflow\python\training\tracking\base.py:587, in no_automatic_dependency_tracking.<locals>._method_wrapper(self, *args, **kwargs)
585 self._self_setattr_tracking = False # pylint: disable=protected-access
586 try:
--> 587 result = method(self, *args, **kwargs)
588 finally:
589 self._self_setattr_tracking = previous_value # pylint: disable=protected-access
File ~\Anaconda3\lib\site-packages\keras\utils\traceback_utils.py:67, in filter_traceback.<locals>.error_handler(*args, **kwargs)
65 except Exception as e: # pylint: disable=broad-except
66 filtered_tb = _process_traceback_frames(e.__traceback__)
---> 67 raise e.with_traceback(filtered_tb) from None
68 finally:
69 del filtered_tb
File ~\Anaconda3\lib\site-packages\keras\engine\input_spec.py:228, in assert_input_compatibility(input_spec, inputs, layer_name)
226 ndim = x.shape.rank
227 if ndim is not None and ndim < spec.min_ndim:
--> 228 raise ValueError(f'Input {input_index} of layer "{layer_name}" '
229 'is incompatible with the layer: '
230 f'expected min_ndim={spec.min_ndim}, '
231 f'found ndim={ndim}. '
232 f'Full shape received: {tuple(shape)}')
233 # Check dtype.
234 if spec.dtype is not None:
ValueError: Input 0 of layer "conv1d_37" is incompatible with the layer: expected min_ndim=3, found ndim=2. Full shape received: (None, 128)
CodePudding user response:
May be try using return_sequences=True
. It may resolve the error.
Bcz the dimensions LSTM is expecting is (None, 1, 128) but right now it is getting only 2 dimensions which are (None, 128).
CodePudding user response:
The problem is that you are passing only the output of the first LSTM layer not the hidden states information to the next LSTM Layer for that you must set return_sequences = True