在训练和预测多 class 时间序列 class 化时保存 LSTM 隐藏状态

Saving LSTM hidden states while training and predicting for multi-class time series classification

我正在尝试将 LSTM 用于时间序列数据的多classclass化。

训练集的维度为 (390, 179),即 390 个对象,每个对象有 179 个时间步长。

有 37 种可能 classes.

我想使用仅包含 LSTM 和激活层的 Keras 模型来class验证输入数据。

我还需要通过模型的所有训练数据和测试数据的隐藏状态,在 LSTM 的每一步(不仅仅是最终状态)。

我知道需要 return_sequences=True,但我无法匹配尺寸。

下面是我试过的一些代码,但我已经尝试了很多其他来自杂乱的 stackexchange 和 git 问题的调用组合。在所有这些中,我都遇到了一些尺寸不匹配或其他问题。

我不知道如何从模型中提取隐藏状态表示。

我们有 X_train.shape = (390, 1, 179)Y_train.shape = (390, 37)(一次性二元向量)/.

n_units = 8
n_sequence = 179
n_class = 37

x = Input(shape=(1, n_sequence))
y = LSTM(n_units, return_sequences=True)(x)
z = Dense(n_class, activation='softmax')(y)

model = Model(inputs=[x], outputs=[y])
model.compile(loss='categorical_crossentropy', optimizer='adam')

model.fit(X_train, Y_train, epochs=100, batch_size=128)
Y_test_predict = model.predict(X_test, batch_size=128)

这是上面给我的:

ValueError: A target array with shape (390, 37) was passed for an output of shape (None, 1, 37) while using as loss 'categorical_crossentropy'. This loss expects targets to have the same shape as the output.

你输入的形状应该是这样的:(样本、时间步长、特征) 样本是你有多少序列,时间步是你的序列多长时间,以及你想在一个时间步输入多少输入。 如果设置 return_sequences=True,则标签数组的形状应为(样本、时间步长、输出特征)。

似乎没有任何方法可以构建可工作的可训练模型,同时还使用 return_sequences=True 返回隐藏状态。

我找到的修复方法是构建一个预测模型并对其进行训练,然后保存权重。然后我构建了一个以我的 LSTM 层结尾的新模型,并为其提供了经过训练的权重。因此,使用 return_sequences=True,我能够预测新数据并获得每个隐藏状态的数据表示。