【问题标题】:Many-to-many classification with Keras LSTM使用 Keras LSTM 进行多对多分类
【发布时间】:2019-06-24 16:53:09
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: python tensorflow machine-learning keras lstm


    【解决方案1】:

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

    如果你想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        
    _________________________________________________________________
    
    1. 另一个选项是您可以使用完整的返回序列作为下一层的特征。在这种情况下,创建一个简单的Dense 层,其输入将为[batch, seq_len*lstm_output_dims]

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

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

    【讨论】:

    • 感谢您的回答。但是,我不确定您对 seq_length 的含义:这应该是时间步数还是批量大小?我有2000个样品,不应该分批吗?
    • Seq-length 表示问题中的时间步长。你能重新定义你的第二个问题吗?
    • 我想我自己能够回答这个问题 - 这是关于批量大小的。我有 2000 个样本,但我认为我应该使用 1 到最多 10 个样本的小批量。如果我正确理解了您的代码(我通常使用其他表示法),您根本没有定义批量大小,这就是它在输出形状中显示“无”的原因。
    • 为什么model1_outputs 被定义了两次?第一个定义是否有我不理解的含义?
    猜你喜欢
    • 2018-03-08
    • 1970-01-01
    • 2018-06-12
    • 2021-05-04
    • 2017-09-27
    • 1970-01-01
    • 1970-01-01
    • 2018-07-12
    • 2020-02-08
    相关资源
    最近更新 更多