【问题标题】:How can I do a sequence-to-sequence model (RNN / LSTM) with Keras with fixed length data?如何使用具有固定长度数据的 Keras 进行序列到序列模型 (RNN / LSTM)?
【发布时间】:2020-02-14 14:04:25
【问题描述】:

我想做的事情看起来很简单,但我在网上找不到任何例子。首先,我不是在使用语言工作,所以所有 embedding 的东西都给我的任务增加了不必要的复杂性。

我输入了(1, 1000) 向量的形式。它们是时间序列数据,所以我将按顺序排列其中的 10 个。如果我正确理解张量,哪一个给了我一些形状(10, 1, 1000),对吧?

我想通过 RNN/LSTM 传递它,并且输出也应该具有相同的形状 (10, 1, 1000)。即10个1000维的向量。

【问题讨论】:

    标签: python tensorflow keras lstm sequence-modeling


    【解决方案1】:

    您需要做的第一件事是了解您认为的序列是“什么”。

    步骤是什么?它们是 10 个时间步长吗?或者它们是 1000 个时间步长?


    我最初假设您有 1000 个时间步长。

    那么下一个问题是:这 10 件事是什么?它们是相同性质的 10 个不同的独立示例吗?或者它们是来自同一个例子的 10 个不同性质(特征)的平行事物?


    这些问题是最重要的部分,你需要知道你是否有:

    • (10, 1000, 1):10 个单独的示例,每个示例 1000 个时间步长,测量单个变量/特征
    • (1, 1000, 10):1 个长序列,1000 个时间步长,测量 10 个独立的变量/特征
      • 您需要在滑动窗口中划分数据,因为上述两种情况的示例太少(网上有很多关于如何执行此操作的示例)。如果你不这样做,你的模型将会过度拟合。
      • 滑动窗口你将把数据变成(more_examples, shorter_length, same_features)
    • (1000, 10, 1): 1000 个不同序列的 10 个时间步长测量单个 var/feature
      • 好数据,一切顺利
    • (1, 10, 1000):10 个时间步长的 1 个单序列,测量 1000 个独立变量/特征
      • 我不确定这些数据是否可以训练,即使您尝试滑动窗口也没有足够的示例
    • (10, 1, 1000):10 个单独的例子,1 个时间步长,测量 1000 个变量/特征
    • (1000, 1, 10):1000 个不同序列的 1 个时间步长,测量 10 个变量。
      • 上述两种情况不是使用 LSTM 的序列。

    一旦你决定了,就该开始工作了:

    根据您的情况正确堆叠输入数据并启动模型。

    我会认为你有形状为(samples, timesteps, features) 的数据,那么你的模型可以像这样:

    inputs = Input((timesteps, features)) #or (None,features) for variable length
    outputs = LSTM(any_units, return_sequences=True)(inputs)
    .... can add more LSTM layers with different units, and return_sequences=True
    .... can add Conv1D layers with padding='same', any number of filters
    outputs = Dense(desired_features, activation=some_useful_activation)(outputs)
    

    请注意,您的输出必然是(samples, timesteps, desired_features)。如果您想要不同的最终形状,请在模型之外对其进行整形。

    【讨论】:

    • TimeDistributed 呢?
    • LSTMConv1D 都能正确处理 3D 数据。 Dense 层将始终仅适用于最后一个轴(因此,尽管过去 TimeDistributed 在这种情况下对于 Dense 层是必需的,但您不再需要它了)。 ---- 如今,TimeDistributed 仅应在您不希望图层更改的轴 1 中有“额外”维度时使用。
    • 我的输出应该与我的输入形状相匹配
    【解决方案2】:

    如果您只想要一个 LSTM 模型,它接受形状为 (nb_seq, 1, 1000) 的输入(nb_seq 是您的序列数,在您的情况下为 10)并输出相同的形状,这里是一个您可以适应的基本模型:

    input_x = Input(shape=(1, 1000))
    x = LSTM(64, return_sequences=True)(input_x)
    x = LSTM(64, return_sequences=True)(x)
    x = Dense(1000)(x)
    
    Model(inputs=input_x, outputs=x)
    

    return_sequence=True 的 LSTM 层将返回一个形状为 (nb_seq, 1, 64) 的张量(64 是 LSTM 层的神经元数量),因此为了找到原始形状,您可以通过这个张量通过一个 Dense 层,它会给你一个 (nb_seq, 1, 1000) 的形状,或者你可以在最后一个 LSTM 层上直接有 1000 个神经元(我不推荐,因为它会生成很多参数)。

    你可以随意修改。

    精确后编辑

    由于 keras LSTM 只接受 3D 输入,您可以通过在开始时传递一个 Timedistributed flatten 层来欺骗它:

    input_x = Input(shape=(10, 1, 1000))
    x = TimeDistributed(Flatten())(input_x)
    x = LSTM(64, return_sequences=True)(x)
    x = LSTM(64, return_sequences=True)(x)
    x = Dense(1000)(x)
    x = Reshape(target_shape=(10, 1, 1000))(x)
    
    Model(inputs=input_x, outputs=x)
    

    这给了你这个总结:

    【讨论】:

    • 在这种情况下nb_seq 是什么?为什么最后会有一个致密层?最后会给我1000个数字。我需要 10 个 1000 维的向量,不是吗?
    • 我看不到这里如何使用nb_seq。看起来这只会返回 (1, 1000) 作为输出,不是吗?
    • 10 是您要分类的样本数?或者你有 number_sample * (10, 1, 1000) 个向量来分类吗?
    • 一个样本由 10 个向量组成。所以是number_sample * (10, 1, 1000)
    • 好吧,我完全误解了你的问题,对不起。将尝试寻找解决方案
    猜你喜欢
    • 2021-07-22
    • 2021-01-25
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 2019-04-17
    • 1970-01-01
    • 2017-03-28
    • 2018-12-08
    相关资源
    最近更新 更多