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

时间:2019-08-22 16:43:26

标签: python keras time-series lstm multiclass-classification

我正在尝试使用LSTM对时间序列数据进行多类分类。

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

有37种可能的课程。

我想使用仅具有LSTM和激活层的Keras模型对输入数据进行分类。

在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.

2 个答案:

答案 0 :(得分:0)

您输入的形状应如下所示:(样本,时间步长,特征) 样本的位置是您有多少个序列,时间步长是序列的时间长短,并且要在一个时间步长中显示要输入的输入数量。 如果设置return_sequences = True,则标签数组的形状应为(样本,时间步长,输出特征)。

答案 1 :(得分:0)

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

我发现的解决方法是建立一个预测器模型并对其进行训练,然后保存权重。然后,我建立了一个新模型,该模型以我的LSTM层结束,并提供了经过训练的权重。因此,使用return_sequences=True,我可以预测新数据并获得每个隐藏状态的数据表示。

相关问题