3

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

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

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

4

2 回答 2

2

您需要做的第一件事是知道您认为那里的序列“什么”。

步骤是什么?它们是 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): 1 个 10 个时间步长的单序列,测量 1000 个独立变量/特征
    • 我不确定这些数据是否可以训练,即使您尝试滑动窗口也没有足够的示例
  • (10, 1, 1000):10 个单独的示例,1 个时间步长,测量 1000 个变量/特征
  • (1000, 1, 10):1000 个不同序列的 1 个时间步长,测量 10 个变量。
    • 上述两种情况不是使用 LSTM 的序列。

一旦你决定了这一点,那么就该工作了:

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

我会认为你有 shape 的数据(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). 如果您想要不同的最终形状,请在模型之外对其进行整形。

于 2020-02-17T13:41:20.427 回答
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 层的神经元数量),因此为了找到原始形状,您可以通过此张量一个密集层,它将为您提供 (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)

这给了你这个总结:

型号汇总

于 2020-02-14T14:18:30.137 回答