预测时具有不同时间步长的 LSTM

LSTM with different timestep when predicting

假设我有一些形状为 (80,27) 的时间序列数据,这意味着 80 个时间步长和 27 个特征。我想以一种分别预测每个时间步而不是一起预测 80 个时间步的方式训练以下网络,因为在预测阶段我的输入形状是 (1,27) 每个时间步 t 直到我到达 t = 80 . 所以我必须找到一种方法来预测 (1,27) 的 80 个样本时间步长,而不会在训练时丢失随时间的反向传播。

有什么建议吗?

def Model():
    inputs = layers.Input(shape=(80,27))
    
    
    x = layers.Conv1D(64,kernel_size=5,activation="relu",padding="same")(inputs)
    x = layers.Bidirectional(layers.LSTM(256,return_sequences=True))(x)
    x = layers.Bidirectional(layers.LSTM(256,return_sequences=True))(x)
    x = layers.Bidirectional(layers.LSTM(256,return_sequences=True))(x)
    x = layers.Bidirectional(layers.LSTM(128,return_sequences=True))(x)
    x = layers.Bidirectional(layers.LSTM(128,return_sequences=True))(x)
    x = layers.Bidirectional(layers.LSTM(128,return_sequences=True))(x)

    
    x = layers.Dense(512,activation="selu")(x)
    x = layers.Dense(256,activation="selu")(x)
    
    x = layers.Dense(2)(x)
   
    
    return keras.Model(inputs=inputs,outputs=x)

所以有两个不同的问题要回答:

  • 如果您想要可变数量的时间步长,只需将输入形状中的大小设置为 None;即 inputs = layers.Input(shape=(None, 27))。然后,RNN 将在训练和测试时动态地“展开”。 (可能会有一些性能下降,但这是要付出的代价。)
  • 在训练和预测期间,您仍然需要通过时间序列的所有时间步长。那是因为在这种情况下你有一个双向 RNN。对于“单向”RNN,我似乎记得有一个选项允许您通过明确地将先前的上下文作为输入传递并将输出状态作为输出返回来获得有状态的调用。