我正在做一个时间序列序列分类问题。
我有 80 个时间序列,全长 1002。每个序列对应于 4 个类别中的 1 个(铜、镉、铅、汞)。我想使用 Keras LSTM 对此进行建模。这些模型需要以表格形式提供数据[batches, timesteps, features]
。由于每个 seq 都是独立的,因此最基本的设置是X_train
具有 shape [80, 1002, 1]
。这在 LSTM 中运行良好(使用stateful=False
)
但是,1002 是一个相当长的序列长度。较小的尺寸可以表现更好。
假设我将每个 seq 分成 334 的 3 部分。我可以继续使用无状态 LSTM。但是(我认为?)让它对 3 个样本有状态然后重置状态是有意义的(因为 3 个块是相关的)。
如何在 Keras 中实现这一点?
[240, 334, 1]
首先,我使用一个简单的方法将数据转换为形状,X_train.reshape(-1, 334, 1)
但是如何保持 3 个样本的状态,然后重置状态model.fit()
?
我知道我需要打电话给model.reset_states()
某个地方,但找不到任何示例代码来告诉我如何工作。我必须对模型进行子类化吗?我可以使用for epoch in range(num_epochs)
and来做到这一点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)
我知道这里有很多问题,如果这对一个人来说太多了,我很乐意提出单独的问题。