【问题标题】:预测时具有不同时间步长的 LSTM
【发布时间】:2022-01-14 10:58:07
【问题描述】:

假设我有一些形状为 (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)

【问题讨论】:

    标签: python tensorflow keras lstm recurrent-neural-network


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回答!。对于第二部分,您的意思是设置 stateful=True 可能有助于解决问题(在单向 RNN 中)?如果是这样,我在训练和训练期间都需要有状态模型吗?预测还是仅仅在预测阶段?
    • stateful 似乎是层本身保持批次之间的状态(无限期),我认为这将适用于训练和测试期间。我建议查看return_state 类参数和initial_state 调用参数,如果你想拥有那种程度的控制。
    猜你喜欢
    • 1970-01-01
    • 2018-03-09
    • 2020-04-11
    • 1970-01-01
    • 2021-09-08
    • 2019-06-24
    • 1970-01-01
    • 1970-01-01
    • 2020-07-21
    相关资源
    最近更新 更多