有状态LSTM输入形状错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有状态LSTM输入形状错误相关的知识,希望对你有一定的参考价值。

我正在做一个处理长序列多类分类的项目。 这是我的数据google colab snapshot的组织 我将整个序列分成60个子序列,每个子序列包含250个样本。 y_train如下。

y_train = []
for i in range(len(resampled_data)):
  y_train.append(1)
y_train_array = np.array(y_train)
one_hot_y_train = keras.utils.to_categorical(1,num_classes=4)
print("y_train")
print(len(one_hot_y_train))
y_train = np.array([one_hot_y_train]*60)
print(np.shape(y_train))
print(y_train)

我有4个分类类,这个序列被标记为'1'(1级)

并且模型定义如下。

#start constructing  stateful LSTM  model
model = Sequential()       
model.add(keras.layers.LSTM(250,batch_input_shape=(60,250,1), 
activation='tanh',return_sequences=True,stateful=True,recurrent_dropout=0.2))
model.add(keras.layers.core.Dropout(0.2))
model.add(keras.layers.Dense(4,activation='softmax'))
model.compile(loss='sparse_categorical_crossentropy',
          optimizer = 'adam',
          metrics=['accuracy'])
print(model.summary())
model.fit(x_train, y_train, epochs=10, batch_size=250,shuffle=False)

但是在训练模型时,有一个我无法完全理解的错误。

ValueError: Error when checking target: expected dense_23 to have 3 dimensions, but got array with shape (60, 4)

我想知道为什么会发生这种情况以及如何修复它,我的输入形状有问题或者我的概念是错误的吗? PS。在这种情况下,我只是使用一个序列来测试我的模型,如果它可以无误地运行,并且在下一步,我将使用循环来训练所有数据!现在我坚持这个问题。如果有人可以指导我,我将非常感谢!

答案

因为你有return_sequences=True

model.add(keras.layers.LSTM(250,batch_input_shape=(60,250,1), activation='tanh',return_sequences=True,stateful=True,recurrent_dropout=0.2))

它返回形状[batch_size, time_step, hidden_dim]的三维张量

现在,如果你想对这样的时间序列数据使用密集层,你需要在Keras中使用TimeDistributed,方法如下:

model.add(TimeDistributed(Dense(4,activation='softmax')))

以上是关于有状态LSTM输入形状错误的主要内容,如果未能解决你的问题,请参考以下文章

Keras LSTM 层输入形状

Keras 功能 api 输入形状错误,lstm 层收到 2d 而不是 3d 形状

ValueError:检查输入时出错:预期 lstm_16_input 有 3 个维度,但得到的数组形状为 (836, 400, 3, 1)

检查输入时出错:预期 lstm_input 有 3 个维度,但得到了形状为 (160, 1000) 的数组

Keras LSTM 错误 - Logits 和标签应该具有相同的形状

层 lstm_9 的输入 0 与层不兼容:预期 ndim=3,发现 ndim=4。收到的完整形状:[None, 300, 300, 1]