基于keras stateful LSTM的信号分类

Signal classification based on keras stateful LSTM

这是我第一次在 Whosebug 上提问。如果我的英语有任何问题,请原谅我。谢谢

我正在做一个使用 LSTM 对 ECG 序列进行分类的项目。我正在使用 PTB database。有一对 ECG 记录,大约 38s,38000 个数据点(采样率 1kHz)。下采样后,我得到了 250Hz 采样率的新序列以减少数据。我读过一些指出 Basic LSTM 无法完美处理长序列依赖性(超过 400 个时间步长)的论文和教程。所以我决定使用有状态的 LSTM。但是有一个问题让我很困惑。 一个完整的 ECG 序列包含 38(分段样本)x250(每个样本大小(1 秒)),但是这个序列共享相同的 label 例如心肌梗塞。 训练模型时如何定义 train_y? 我应该在完整序列的每一端手动调用 model.reset_states() 吗?在 38 个样本之后?或者有另一种方法可以帮助解决这个问题吗? 如果有人可以帮助我,我将不胜感激!

如有不妥之处,欢迎指正。谢谢!

如果您遇到 RAM 问题,则只需要 True

stateful=False情况下:

你的 X_train 的形状应该像 (patients, 38000, variables)。或者,在下采样的情况下:(patients, 9500, variables)

你的 y_train 的形状应该像 (patients, classes)

如果您的 RAM 问题出在 numpy 数组和您的 PC 上,请转至 stateful=True 案例。但如果它是 GPU 的 OOM 分配,那么你可以先尝试较小的批次大小

stateful=True情况下:

这确实是一个很好的问题...

在您的情况下,如果您保持足够长的序列,则 class 可能在每个片段中都很明显,但如果您确实需要整个 ECG 来检测问题,那么这种方法可能不会很好,目前我不知道其他方法。

对于这种方法,X_train 应该是 (patients * 38, 250, variables)

而对于 y_train,您需要为每个片段重复 classes:(patients * 38, classes)

拟合的时候一定要记得设置shuffle=False

并且数据的组织应该是:

[
   patient 1 - segment 1
   patient 2 - segment 1
   patient 3 - segment 1
   ...
   patient n - segment 1
   ------------------
   patient 1 - segment 2
   patient 2 - segment 2
   ...
   --------------------
   patient 1 - segment 38
   patient 2 - segment 38
   ...
   patient n - segment 38
] 

每个时期使用reset_states()