【发布时间】:2019-02-03 21:45:38
【问题描述】:
我想开发一种用于二进制分类的时间序列方法,在 Keras 中使用有状态 LSTM
这是我的数据的外观。我得到了很多,比如N,录音。每个记录包含 22 个长度为 M_i(i=1,...N) 的时间序列。我想在 Keras 中使用有状态模型,但我不知道如何重塑我的数据,尤其是关于我应该如何定义我的 batch_size。
这是我为stateless LSTM 进行的操作。我为所有录音创建了长度为 look_back 的序列,这样我就有了大小为 (N*(M_i-look_back), look_back, 22=n_features) 的数据
这是我为此目的使用的函数:
def create_dataset(feat,targ, look_back=1):
dataX, dataY = [], []
# print (len(targ)-look_back-1)
for i in range(len(targ)-look_back):
a = feat[i:(i+look_back), :]
dataX.append(a)
dataY.append(targ[i + look_back-1])
return np.array(dataX), np.array(dataY)
其中feat 是大小为(n_samples, n_features)(针对每个记录)的二维数据数组,targ 是目标向量。
所以,我的问题是,根据上面解释的数据,如何为有状态模型重塑数据并考虑批处理概念?有什么预防措施吗?
我想要做的是能够将每个记录的每个 time_step 分类为癫痫发作/非癫痫发作。
编辑:我想到的另一个问题是:我的录音包含不同长度的序列。我的有状态模型可以学习对每个记录的长期依赖关系,这意味着 batch_size 从一个记录到另一个记录不同......如何处理?在完全不同的序列(test_set)上测试会不会造成泛化问题?
谢谢
【问题讨论】:
-
使用有状态的有什么特殊原因吗? (它在计算上与常规层没有什么不同,它也不适合回溯窗口)。
-
stateful=False学习与stateful=True完全相同的东西。没有区别。唯一的区别是:stateful=False认为“这批输入独立于前一批输入”,而stateful=True事情“这批输入与最后一批输入的序列相同,我会假设没有中断”。 -
我认为“有状态”这个名字选得非常糟糕。 “无状态”一词表明没有记忆状态,这是不正确的。它应该被称为
keep_states=True(因为不要在每批之后重置状态)。 -
不需要冗余(滑动窗口),我不知道他们为什么教这个。这完全违背了 LSTM 可以学习的“长期依赖”。
-
我必须更好地理解您的数据才能回答。请看下面我的回答。你不需要“切断信号”。但是“如果你削减”,那么你需要 stateful=True。 (但如果你没有理由削减,就不要削减)。