使用 Keras LSTM 进行多对多分类

Tho*_*mas 3 python machine-learning lstm keras tensorflow

我是 Keras 中 RNN/LSTM 的新手,需要关于是否/如何将它们用于我的问题的建议,这是多对多分类。

我有许多时间序列:大约 1500 次“运行”,每次持续大约 100-300 个时间步长并且有多个通道。我知道我需要将数据零填充到最大时间步数,因此我的数据如下所示:

[nb_samples, timesteps, input_dim]: [1500, 300, 10]
Run Code Online (Sandbox Code Playgroud)

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

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

Ank*_*sal 5

可以有很多方法来解决这个问题,我正在指定哪种方法可以很好地解决您的问题。

如果你想要stack两层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        
_________________________________________________________________
Run Code Online (Sandbox Code Playgroud)
  1. 另一种选择是您可以使用完整的返回序列作为下一层的特征。在这种情况下,制作一个简单的Dense层,其输入将为[batch, seq_len*lstm_output_dims].

注意:这些特征对于分类任务很有用,但大多数情况下,我们使用堆叠的 lstm 层并将其输出with-out complete sequence用作分类层的特征。

这个答案可能有助于理解LSTM用于不同目的的另一种架构方法。