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

Posted

技术标签:

【中文标题】ValueError:输入 0 与层 lstm_13 不兼容:预期 ndim=3,发现 ndim=4【英文标题】:ValueError: Input 0 is incompatible with layer lstm_13: expected ndim=3, found ndim=4 【发布时间】:2017-11-18 21:03:23 【问题描述】:

我正在尝试进行多类分类,以下是我的训练输入和输出的详细信息:

train_input.shape= (1, 95000, 360) (95000 长度的输入数组,每个 元素是一个 360 长度的数组)

train_output.shape = (1, 95000, 22)(有 22 个类)

model = Sequential()

model.add(LSTM(22, input_shape=(1, 95000,360)))
model.add(Dense(22, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
print(model.summary())
model.fit(train_input, train_output, epochs=2, batch_size=500)

错误是:

ValueError: Input 0 is in compatible with layer lstm_13: expected ndim=3, found ndim=4 排队: model.add(LSTM(22, input_shape=(1, 95000,360)))

请帮帮我,我无法通过其他答案解决。

【问题讨论】:

这里是为 LSTM/RNN 创建数据的最快和正确的方法:***.com/a/62570576/10375049 【参考方案1】:

我解决了这个问题

输入大小:(95000,360,1) 和 输出大小:(95000,22)

并在定义模型的代码中将输入形状更改为(360,1)

model = Sequential()
model.add(LSTM(22, input_shape=(360,1)))
model.add(Dense(22, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
print(model.summary())
model.fit(ml2_train_input, ml2_train_output_enc, epochs=2, batch_size=500)

【讨论】:

【参考方案2】:

input_shape 应该是(时间步长,n_features)。删除第一个维度。

input_shape = (95000,360)

输出相同。

【讨论】:

不,这也给出了一些错误,例如:None,95000,360 but found 1,95000,360 这是您输入数据形状的问题。第一个维度应该是每个样本。您的输入应该是(n_samples、timesteps、n_features)。查看您的其他评论, 95000 是您的 n_samples 而不是您的时间步长。如果您只有一个具有 360 个时间步长的特征,那么您提出的特征就是正确的格式。 好的,我的输入有 360-360 个块(我想将其视为特征),所以输入的形状应该是什么,里面应该写什么->model. add(LSTM(22, input_shape=(?))) 我需要知道您的输入是什么。是时间序列吗?你观察了多少个不同的变量?我给你举个例子:如果我为了预测天气(1 = 好,0 = 坏)而观察每小时 24 小时的降雨量和温度,我会这样做 365 天,我会有 365 个样本,每个样本有 24 个时间步长和 2 个变量(一个代表下雨,一个代表温度),所以我的输入将具有形状 (365, 24, 2) 和 input_shape = (24, 2) . 我的输入是一个 big 数组数组,big 数组中的每个数组共有 360 个信号值,这 360 个块是分类为“L”心律失常或“R”心律失常等或正常。并且有 95000 个这样的数组,big 数组包含所有这 95000 个样本(初始形状:95000,360),并且经过一次热编码后的输出具有形状:(95000,22),因为有 21 种类型心律失常和 1 正常【参考方案3】:

嗯,我认为主要问题在于网络中的return_sequences 参数。对于最后一层,该超参数应设置为False,对于最后一层,应设置为true其他上一层

【讨论】:

添加到这个答案:通常如果错误在第一层 - 那么问题可能出在input_shape。如果问题出在其他层,那么问题可能在于您需要设置return_sequences -True【参考方案4】:

在人工神经网络 (ANN) 中,输入的形状为 (N,D),其中 N 是样本数,D 是特征数。

在 RNN、GRU 和 LSTM 中,输入的形状为 (N,T,D),其中 N 是样本数,T 是时间序列长度,D 是特征数。

所以,在添加图层的同时

ANN 的输入(shape = (D,)) 和 RNN、GRU 和 LSTM 的输入(shape = (T,D))

【讨论】:

【参考方案5】:

加起来上面的答案, return_sequences不应该在所有层都设置为True,只是不要在最后一层设置,并省略return_sequences=True

【讨论】:

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

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