基于keras状态LSTM的信号分类

时间:2018-07-20 15:26:47

标签: python tensorflow keras lstm rnn

这是我第一次询问StackOverflow。如果我的英语有任何问题,请原谅我。谢谢

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

如果有没有完全解释的内容,请Plese纠正我。谢谢!

1 个答案:

答案 0 :(得分:0)

仅在遇到RAM问题时才需要True

stateful=False情况下:

您的X_train的形状应类似于(patients, 38000, variables)。或者,在降采样的情况下:(patients, 9500, variables)

您的y_train的形状应类似于(patients, classes)

如果numpy阵列和PC出现RAM问题,请转到stateful=True情况。但是,如果这是GPU的OOM分配,那么您可以先尝试使用较小的批处理大小

stateful=True情况下:

这确实是一个非常好的问题...

在您的情况下,如果您保留足够长的序列,则该类在每个段中都应该引人注目,但是如果您确实需要整个ECG来检测问题,则此方法可能不是很好,我不会目前还不知道另一种方法。

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

对于y_train,您将需要为每个段重复这些类:(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()