我可以将我的长序列分成 3 个较小的序列并使用有状态 LSTM 处理 3 个样本吗?

Posted

技术标签:

【中文标题】我可以将我的长序列分成 3 个较小的序列并使用有状态 LSTM 处理 3 个样本吗?【英文标题】:Can I split my long sequences into 3 smaller ones and use a stateful LSTM for 3 samples? 【发布时间】:2021-07-21 04:14:59 【问题描述】:

我在做一个时序序列分类问题。

我有 80 个时间序列,长度均为 1002。每个序列对应于 4 个类别中的 1 个(铜、镉、铅、汞)。我想使用 Keras LSTM 对此进行建模。这些模型需要以[batches, timesteps, features] 的形式提供数据。由于每个 seq 都是独立的,所以最基本的设置是让 X_train 具有形状 [80, 1002, 1]。这在 LSTM 中运行良好(使用 stateful=False

但是,1002 是一个相当长的序列长度。较小的尺寸可能会更好。

假设我将每个 seq 分成 334 的 3 部分。我可以继续使用无状态 LSTM。但是(我认为?)让它对 3 个样本有状态然后重置状态是有意义的(因为 3 个块是相关的)。

如何在 Keras 中实现这一点?

首先,我使用简单的X_train.reshape(-1, 334, 1) 将数据转换为形状[240, 334, 1],但是如何保持3 个样本的状态,然后重置model.fit() 中的状态?

我知道我需要在某个地方致电model.reset_states(),但找不到任何示例代码来告诉我如何使用它。我必须对模型进行子类化吗?我可以使用for epoch in range(num_epochs)GradientTape 执行此操作吗?我有哪些选择?我该如何实现?

另外,如果我将序列拆分,我该如何处理标签?我是否将它们乘以每个 seq 分成的块数(在这种情况下为 3)? LSTM 有没有办法摄取 3 个样本然后吐出一个预测?还是每个样本都必须对应一个预测?

最后,如果我将我的序列分成 3 个子序列,我是否必须有 3 个批量大小?或者我可以选择 3 的任意倍数吗?

这是我在X_train.shape == [80, 1002, 1] 中使用的超级基本代码。

model = Sequential([
    LSTM(10, batch_input_shape=(10, 1002, 1)), # 10 samples per batch
    Dense(4, activation='sigmoid')
])
model.compile(loss='categorical_crossentropy',
             optimizer='rmsprop',
             metrics=['accuracy'])
model.fit(X_train, y_train, epochs=3, batch_size=10, shuffle=False)

我知道这里有很多问题,如果这对一个人来说太多了,我很乐意提出单独的问题。

【问题讨论】:

【参考方案1】:

简单的解决方案是将数据从具有 1 个特征重塑为具有 3 个特征。

[80, 1002, 1] 变成[80, 334, 3] 而不是[240, 334, 1]。这使样本数量保持不变,因此您不必弄乱有状态。您也可以将它与普通的fit() API 一起使用。

【讨论】:

以上是关于我可以将我的长序列分成 3 个较小的序列并使用有状态 LSTM 处理 3 个样本吗?的主要内容,如果未能解决你的问题,请参考以下文章

希尔排序法

Matlab - 能够将一个结构的字段分解成几个较小的字段。

Scratch 3.0​ | 希尔排序的实现

iOS:将大型 XIB 重构为几个较小的 XIB 文件以提高速度

返回一个大查询还是几个较小的查询更好?

如何在 N 个较小的矩形上拆分一个大矩形以使其看起来随机? [关闭]