ValueError:输入 0 与层 lstm_1 不兼容:预期 ndim=3,发现 ndim=2 [keras]

Posted

技术标签:

【中文标题】ValueError:输入 0 与层 lstm_1 不兼容:预期 ndim=3,发现 ndim=2 [keras]【英文标题】:ValueError: Input 0 is incompatible with layer lstm_1: expected ndim=3, found ndim=2 [keras] 【发布时间】:2019-03-13 21:00:36 【问题描述】:

我收到了错误: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 的矩阵。

【问题讨论】:

尝试使用input_shape=(24, 48) 不,那行不通。给出错误ValueError: Input 0 is incompatible with layer conv2d_1: expected ndim=4, found ndim=3 George 是对的,您不应该指定模型中的数据数量。如果问题仍然存在,请参阅:machinelearningmastery.com/… 检查您在 model.fit() 调用中作为 x_train 和 x_validation 给出的内容,它们的大小应该是 (30,24,48) 而不是 (24,48,30) 。 input_shape = (24,48,30) 应该是 input_shape = (24,48) @yaminigoel:X_train的形状是什么? 【参考方案1】:

问题在于,在最后一个 Dense 层之后(在 lstm 层之前),输出形状是 (?, 20) 并且 lstm 层需要 3D 张量,而不是 2D。所以,您可以在为了在喂给 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)

(我没有使用顺序模式,我使用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))

你必须在Lambda中使用扩展暗淡

【讨论】:

如果我使用功能 API,它可以正常工作,但在顺序模式下,它会给我以下错误 TypeError: Failed to convert object of type <class 'keras.engine.sequential.Sequential'> to Tensor. Contents: <keras.engine.sequential.Sequential object at 0x7f44e3530668>. Consider casting elements to a supported type. for model = tf.expand_dims(model, axis=-1)。我需要使用顺序模式,你能帮我吗? 嗨@George!你的回答解决了我的问题。我在其他层面有点困惑,我相信你可以回答我。我有“n”个大小相等的向量,我如何将它们组合起来以将它们提供给 RNN。我的意思是向量是二维的,我有 n 个这样的二维向量,我需要将它们发送到 RNN,你能告诉我如何实现这一点吗?我也不希望将它们连接起来,我需要将特定大小的“n”个向量放入 RNN 层。

以上是关于ValueError:输入 0 与层 lstm_1 不兼容:预期 ndim=3,发现 ndim=2 [keras]的主要内容,如果未能解决你的问题,请参考以下文章

ValueError: 层 lstm_12 的输入 0 与层不兼容:预期 ndim=3,发现 ndim=4

ValueError: 层 lstm_21 的输入 0 与层不兼容:预期 ndim=3,发现 ndim=2。收到的完整形状:(无,546)

ValueError:lstm_45 层的输入 0 与层不兼容:预期 ndim=3,发现 ndim=4。收到的完整形状:(无,无,无,128)

ValueError: 层序贯_1 的输入 0 与层不兼容:预期 ndim=3,发现 ndim=2。收到的完整形状:(无,93)

如何修复'ValueError:输入0与层simple_rnn_1不兼容:预期形状=(无,无,20),找到形状=(无,无,2,20)'

ValueError:输入 0 与层 conv2d_1 不兼容:预期 ndim=4,发现 ndim=3