我想做的事情看起来很简单,但我在网上找不到任何例子。首先,我不是在使用语言工作,所以所有这些都给embedding
我的任务增加了不必要的复杂性。
我有输入,以(1, 1000)
向量的形式。它们是时间序列数据,所以我将按顺序排列其中的 10 个。如果我正确理解张量,哪一个给了我一些形状(10, 1, 1000)
,对吧?
我想通过 RNN/LSTM 传递它,输出也应该是相同的形状(10, 1, 1000)
。即,10 个向量,每个向量 1000 维。
我想做的事情看起来很简单,但我在网上找不到任何例子。首先,我不是在使用语言工作,所以所有这些都给embedding
我的任务增加了不必要的复杂性。
我有输入,以(1, 1000)
向量的形式。它们是时间序列数据,所以我将按顺序排列其中的 10 个。如果我正确理解张量,哪一个给了我一些形状(10, 1, 1000)
,对吧?
我想通过 RNN/LSTM 传递它,输出也应该是相同的形状(10, 1, 1000)
。即,10 个向量,每个向量 1000 维。
您需要做的第一件事是知道您认为那里的序列“什么”。
步骤是什么?它们是 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 个变量。
一旦你决定了这一点,那么就该工作了:
根据您的情况正确堆叠输入数据并启动模型。
我会认为你有 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)
. 如果您想要不同的最终形状,请在模型之外对其进行整形。
如果您只想要一个输入形状的 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)
这给了你这个总结: