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)'