【问题标题】:Stateful vs Stateless LSTM有状态与无状态 LSTM
【发布时间】:2020-04-25 17:32:22
【问题描述】:

我正在尝试在 Keras 中使用 LSTM,但我不确定我应该使用 statefull 还是 stateless LSTM。我在网上阅读了很多资源,但似乎不适用于我的案例。

我有一个很长的预测序列X=[X1,X2,....,Xn] 和一个很长的响应序列y=[0,0,...,1,1,0,...0]。它们具有相同的长度,响应只能取值 1 或 0。我的计划是对长预测序列进行二次抽样,并使用短序列(长度 4)来预测接下来 3 个时间点的响应。所以我的训练数据看起来是这样的

[X1,X2,X3,X4],[y5,y6,y7]
[X2,X3,X4,X5],[y6,y7,y8]
...

如果我使用所有这些可用的短系列(示例),我认为我应该选择有状态的。但是,由于y 中的 0 比 1 多很多,我将保留所有具有 1 的样本在短响应系列中(例如:保留此样本 [y5=0,y6=1,y7=0])但我会随机删除很多其他样本只是为了使数据平衡。

我不确定我是否应该在这里使用有状态,因为一些短系列可能彼此相距很远。

【问题讨论】:

    标签: keras time-series lstm lstm-stateful


    【解决方案1】:

    我相信您正在尝试使用 LSTM 训练模型,但您还希望删除该时间序列数据的某些部分并能够同时训练模型。

    从技术上讲,您只需使用有状态 LSTM 并将您的数据切成相同的长度,然后提供 sample_weight 即可实现这一目标。例如,model.fit(x=data, y=class, sample_weight=np.array([1,1,0,0,0,1])),这将帮助您通过删除索引2来实现您想要的, 3,4 无需手动将其从数据中删除。

    通常,我们修改损失而不是删除时间序列的某些部分,例如错误地分类 1 类会产生 10 倍于 0 类的损失。

    希望有帮助

    【讨论】:

    • 感谢您的回答。我同意你的看法,我们可以使用类重量的样本重量来达到同样的效果。然而,我最初的系列很长,要花很长时间才能把所有的东西都切开。我想知道如果我丢掉很多切片会发生什么,我还应该使用有状态的 LSTM 吗?
    • 如果您需要删除那么多数据,那么使用 LSTM 对您没有用处,LSTM 试图逼近从前一个状态到下一个状态的转换函数。因此,如果您删除两点之间的数据,您的数据将断开连接,因此您无法再训练模型,除非您有某种方法可以获取 LSTM 的先前内部状态,您仍然可以毫无问题地训练您的模型,只需指定断开组件的初始状态,你会很好去的。
    • 此外,您可以使用“for循环”之类的方法,并为只有0且概率P为0的实例随机设置权重。结合损失修改可能非常有效。或者您可以将数据分成小块而不考虑连续性和初始状态并对其进行训练,这可能会导致性能下降。
    猜你喜欢
    • 2011-07-16
    • 2018-03-30
    • 1970-01-01
    • 2017-08-31
    • 2016-11-09
    • 2021-04-27
    • 2018-04-04
    • 1970-01-01
    相关资源
    最近更新 更多