我想开发一个二进制分类的时间序列方法,在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
是目标向量。在
因此,我的问题是,基于上面解释的数据,如何重塑有状态模型的数据并考虑批处理的概念?有什么预防措施吗?在
我想做的是能够将每段录音的每一个时间步归类为发作/不发作。在
编辑:我想的另一个问题是:我的录音包含不同长度的序列。我的状态模型可以学习每个记录的长期依赖关系,所以这意味着批处理大小在不同的记录之间是不同的。。。怎么处理?当在完全不同的序列(测试集)上测试时,它不会引起泛化问题吗?在
谢谢
我不认为你需要一个有状态层。在
如果你想长期学习,就不要创建这些滑动窗口。将您的数据格式化为:
我不太清楚你问题中的措辞。如果“录音”像“电影”或“歌曲”,“声音剪辑”或类似的东西,那么:
按照“录制”的思想,时间步将是音频文件中的“视频中的帧”或“采样”(1个频道的时间x采样率)。(请注意,keras中的“samples”是“sequences/recordings”,而音频处理中的“samples”是keras中的“steps”)。在
最后,特征/变量的数量。在RGB中,也有3个频道(如电影中的3个频道)。在其他类型的数据中,它们可能是温度、压力等
将您的数据设置为这样的形状将同时适用于stateful=True和False。在
这两种培训方法相当:
^{pr2}$可能只有优化器的更新方式有变化。在
对于您的例子,如果您可以创建这样的输入数据,并且您不打算递归地预测未来,我看不出使用
stateful=True
的理由。在对每一步进行分类
为了对每个步骤进行分类,您不需要创建滑动窗口,也不必使用
stateful=True
。在通过设置
return_sequences=True
,递归层可以选择输出所有时间点。在如果您有一个形状为
(batch, steps, features)
的输入,则需要形状为(batch, steps, 1)
的目标,即每一步一个类。在简而言之,您需要:
return_sequences=True
的LSTM层X_train
形状为(files, total_eeg_length, 22)
Y_train
形状为(files, total_eeg_length, 1)
提示:由于LSTMs从来没有对开头进行很好的分类,所以可以尝试使用
Bidirectional(LSTM(....))
层。在不同长度的输入
要使用不同长度的输入,需要设置
input_shape=(None, features)
。考虑到我们在聊天中的讨论,features = 22
。在然后您可以:
分别加载每个EEG:
X_train
作为(1, eeg_length, 22)
Y_train
作为(1, eeg_length, 1)
model.train_on_batch(array, targets)
分别训练每个脑电图。在test_on_batch
作为验证数据。在用0或另一个伪值填充较短的eeg,直到它们都达到
max_eeg_length
并使用:Masking
层,以丢弃具有伪值的步骤。在X_train
作为(eegs, max_eeg_length, 22)
Y_train
作为(eegs, max_eeg_length, 1)
model.fit(X_train, Y_train,...)
训练相关问题 更多 >
编程相关推荐