如何解决我可以将我的长序列分成 3 个较小的序列并使用有状态的 LSTM 来处理 3 个样本吗?
我有 80 个时间序列,全长 1002。每个 seq 对应于 4 个类别中的一个(铜、镉、铅、汞)。我想使用 Keras LSTM 对此进行建模。这些模型需要以 [batches,timesteps,features]
的形式提供数据。由于每个 seq 都是独立的,因此最基本的设置是 X_train
具有形状 [80,1002,1]
。这在 LSTM 中运行良好(使用 stateful=False
)
但是,1002 是一个相当长的序列长度。较小的尺寸可能会表现得更好。
假设我将每个 seq 分成 334 个的 3 部分。我可以继续使用无状态 LSTM。但是(我认为?)让它对 3 个样本有状态然后重置状态(因为 3 个块是相关的)是有意义的。
如何在 Keras 中实现这一点?
首先,我使用一个简单的 [240,334,1]
将数据转换为形状 X_train.reshape(-1,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,1]
一起使用的超级基本代码。
model = Sequential([
LSTM(10,batch_input_shape=(10,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 个特征重塑为具有 3 个特征。
将 [80,1002,1]
变成 [80,334,3]
而不是 [240,1]
。这使样本数量保持不变,因此您不必弄乱状态。您也可以将它与普通的 fit()
API 一起使用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。