使用Keras LSTM进行多对多分类

4

我是新手,对于Keras中的RNN/LSTM不熟悉,并需要建议是否/如何在我的问题上使用它们,我的问题是多对多分类。

我有许多时间序列:大约1500个“运行”,每个运行持续100-300个时间步长,并具有多个通道。我了解到我需要将数据零填充到最大的时间步数,所以我的数据看起来像这样:

[nb_samples, timesteps, input_dim]: [1500, 300, 10]

由于即使对于人来说,要获取单个时间步长的标签也是不可能的,而不知道过去的情况,因此我可以进行特征工程并训练经典分类算法,但是我认为在这里使用LSTMs会更合适。 这个答案告诉我,在Keras中进行多对多分类时,需要将return_sequences设置为True。然而,我并不太明白如何从这里开始-我是否将返回序列用作另一个普通层的输入? 我该如何将其连接到我的输出层?

非常感谢任何帮助、提示或链接到教程-我发现了许多有关多对一分类的东西,但没有关于多对多的好东西。

1个回答

5

有很多方法可以解决这个问题,我在这里指定了一个适合你的方法。

如果您想要堆叠两个 LSTM 层,则可以使用 return-seq 来帮助学习另一个 LSTM 层,如下面的示例所示。

from keras.layers import Dense, Flatten, LSTM, Activation
from keras.layers import Dropout, RepeatVector, TimeDistributed
from keras import Input, Model

seq_length = 15
input_dims = 10
output_dims = 8 # number of classes
n_hidden = 10
model1_inputs = Input(shape=(seq_length,input_dims,))
model1_outputs = Input(shape=(output_dims,))

net1 = LSTM(n_hidden, return_sequences=True)(model1_inputs)
net1 = LSTM(n_hidden, return_sequences=False)(net1)
net1 = Dense(output_dims, activation='relu')(net1)
model1_outputs = net1

model1 = Model(inputs=model1_inputs, outputs = model1_outputs, name='model1')

## Fit the model
model1.summary()


_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)        (None, 15, 10)            0         
_________________________________________________________________
lstm_1 (LSTM)                (None, 15, 10)            840       
_________________________________________________________________
lstm_2 (LSTM)                (None, 10)                840       
_________________________________________________________________
dense_3 (Dense)              (None, 8)                 88        
_________________________________________________________________
  1. 另一种选择是将完整的返回序列用作下一层的特征。在这种情况下,制作一个简单的 Dense 层,其输入将为 [batch,seq_len*lstm_output_dims]

注意:这些特征对于分类任务可能有用,但通常我们使用堆叠的LSTM层,并将其输出不包括完整序列作为分类层的特征。

此答案可能有助于了解用于不同目的的LSTM架构的其他方法。


感谢您的回答。不过,我不确定您所说的seq_length是什么意思:它是指时间步长的数量,还是批次大小?我有2000个样本,我不应该将它们分为不同的批次吗? - Thomas
1
Seq-length代表您问题中的时间步长。您能否重新构思您的第二个问题? - Ankish Bansal
我认为我能够自己回答这个问题 - 它是关于批量大小的。我有2000个样本,但我认为我应该使用1到最多10个样本的小批量。如果我正确理解了你的代码(我通常使用另一种符号表示法),你根本没有定义批量大小,这就是为什么输出形状中会显示“None”的原因。 - Thomas
为什么 model1_outputs 被定义了两次?第一次定义有我不理解的含义吗? - Itamar Mushkin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接