我尝试在一系列尺寸为 (9219, 7, 7, 12) 的图像上运行 CNN-LSTM 模型,但出现以下错误:
model = Sequential()
model.add(Conv1D(32, 4, activation='relu', padding='same', input_shape=(train_x.shape[1], train_x.shape[2], train_x.shape[3])))
model.add(LSTM(32, return_sequences=True))
model.add(MaxPooling1D(2))
model.add(Conv1D(16, 8, activation="relu", padding='same'))
model.add(LSTM(64, return_sequences=True))
model.add(MaxPooling1D(2))
model.add(Conv1D(16, 8, activation="relu", padding='same'))
model.add(LSTM(128))
model.add(Dense(3, activation='sigmoid'))
我收到此错误
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-117-d8b5365ec22e> in <cell line: 4>()
2
3 model.add(Conv1D(32, 4, activation='relu', padding='same', input_shape=(train_x.shape[1], train_x.shape[2], train_x.shape[3])))
----> 4 model.add(LSTM(32, return_sequences=True))
5 model.add(MaxPooling1D(2))
6 model.add(Conv1D(16, 8, activation="relu", padding='same'))
2 frames
/usr/local/lib/python3.10/dist-packages/keras/engine/input_spec.py in assert_input_compatibility(input_spec, inputs, layer_name)
233 ndim = shape.rank
234 if ndim != spec.ndim:
--> 235 raise ValueError(
236 f'Input {input_index} of layer "{layer_name}" '
237 "is incompatible with the layer: "
ValueError: Input 0 of layer "lstm_32" is incompatible with the layer: expected ndim=3, found ndim=4. Full shape received: (None, 7, 7, 32)
在您的输入形状中,您提供 3D 输入形状,而您应该提供像这样的 2D 输入形状
input_shape=(train_x.shape[1], train_x.shape[2] * train_x.shape[3])
。这就是第二个隐藏层抛出输入形状错误的原因。
您的代码应如下所示:
model = Sequential()
model.add(Conv1D(32, 4, activation='relu', padding='same', input_shape=(train_x.shape[1], train_x.shape[2] * train_x.shape[3])))
model.add(LSTM(32, return_sequences=True))
model.add(MaxPooling1D(2))
model.add(Conv1D(16, 8, activation="relu", padding='same'))
model.add(LSTM(64, return_sequences=True))
model.add(MaxPooling1D(2))
model.add(Conv1D(16, 8, activation="relu", padding='same'))
model.add(LSTM(128))
model.add(Dense(3, activation='sigmoid'))
from keras.optimizers import Adam
# change the optimizer,loss function
# and metrics according to your need
model.compile(optimizer=Adam(learning_rate=0.001),
loss='binary_crossentropy',
metrics=['accuracy'])
print(model.summary())
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv1d (Conv1D) (None, 10, 32) 672
lstm (LSTM) (None, 10, 32) 8320
max_pooling1d (MaxPooling1 (None, 5, 32) 0
D)
conv1d_1 (Conv1D) (None, 5, 16) 4112
lstm_1 (LSTM) (None, 5, 64) 20736
max_pooling1d_1 (MaxPoolin (None, 2, 64) 0
g1D)
conv1d_2 (Conv1D) (None, 2, 16) 8208
lstm_2 (LSTM) (None, 128) 74240
dense (Dense) (None, 3) 387
=================================================================
Total params: 116675 (455.76 KB)
Trainable params: 116675 (455.76 KB)
Non-trainable params: 0 (0.00 Byte)