基于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()
。
这是我第一次在 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()
。