ValueError: Input 0 is incompatible with layer lstm_1: expected ndim=3, found ndim=2 [keras]

ValueError: Input 0 is incompatible with layer lstm_1: expected ndim=3, found ndim=2 [keras]

我收到错误:ValueError: Input 0 is incompatible with layer lstm_1: expected ndim=3, found ndim=2,代码如下:

def make_model():
  model = Sequential()      

  model.add(Conv2D(20,(5,5), input_shape = (24,48,30), activation = "relu", strides = 1, padding = "valid"))
  model.add(MaxPooling2D(pool_size=(2,2)))        
  model.add(Conv2D(50, (5,5), use_bias = 50))    
  model.add(MaxPooling2D(pool_size=(2,2)))    
  model.add(Flatten())
  model.add(Dense(20, activation = "relu"))
  model.add(LSTM(50, activation="relu", return_sequences=True))

  return model

我的输入是 30 个大小为 24*48 的矩阵。

问题在于,在最后一个Dense层之后(lstm层之前),输出形状为(?,20)并且lstm层需要3D张量,而不是2D.So,你可以扩展维度以便在馈送到 lstm 层之前再添加一个维度。

您可以使用 tf.expand_dims 扩展维度(假设您使用 tensorflow 作为后端)tf expand

input_layer = Input((30,24,48))

model = Conv2D(20,(5,5), input_shape = (30,24,48), activation = "relu", strides = 1, padding = "valid")(input_layer)
model = MaxPooling2D(pool_size=(2,2))(model)        
model = Conv2D(50, (5,5), use_bias = 50)(model)    
model = MaxPooling2D(pool_size=(2,2))(model)  
model = Flatten()(model)
model = Dense(20, activation = "relu")(model)
model = tf.expand_dims(model, axis=-1)
model = LSTM(50, activation="relu", return_sequences=True)(model)

(我没有使用 Sequential 模式,我使用 functional api 因为它更灵活)

如果您想使用顺序模型:

    model = Sequential()      

    model.add(Conv2D(20,(5,5), input_shape = (30, 24, 48), activation = "relu", strides = 1, padding = "valid"))
    model.add(MaxPooling2D(pool_size=(2,2)))        
    model.add(Conv2D(50, (5,5), use_bias = 50))    
    model.add(MaxPooling2D(pool_size=(2,2)))    
    model.add(Flatten())
    model.add(Dense(20, activation = "relu"))
    model.add(Lambda(lambda x: tf.expand_dims(model.output, axis=-1)))
    model.add(LSTM(50, activation="relu", return_sequences=True))

你必须在里面使用 expand dims Lambda