如何在Keras中为有状态LSTM准备数据?

2024-05-14 13:29:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我想开发一个二进制分类的时间序列方法,在Keras中使用状态LSTM

下面是我的数据。我有很多,比如说N,录音。每个记录包含22个长度为M_i(i=1,...N)的时间序列。我想在Keras中使用一个有状态的模型,但是我不知道如何重塑我的数据,尤其是我应该如何定义我的batch_size。在

下面是我如何进行statelessLSTM。我为所有记录创建了长度为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是目标向量。在

因此,我的问题是,基于上面解释的数据,如何重塑有状态模型的数据并考虑批处理的概念?有什么预防措施吗?在

我想做的是能够将每段录音的每一个时间步归类为发作/不发作。在

编辑:我想的另一个问题是:我的录音包含不同长度的序列。我的状态模型可以学习每个记录的长期依赖关系,所以这意味着批处理大小在不同的记录之间是不同的。。。怎么处理?当在完全不同的序列(测试集)上测试时,它不会引起泛化问题吗?在

谢谢


Tags: 数据模型状态记录时间back序列keras
1条回答
网友
1楼 · 发布于 2024-05-14 13:29:25

我不认为你需要一个有状态层。在

如果你想长期学习,就不要创建这些滑动窗口。将您的数据格式化为:

(number_of_independent_sequences, length_or_steps_of_a_sequence, variables_or_features_per_step)

我不太清楚你问题中的措辞。如果“录音”像“电影”或“歌曲”,“声音剪辑”或类似的东西,那么:

  • 序列数=录制数

按照“录制”的思想,时间步将是音频文件中的“视频中的帧”或“采样”(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,...)训练

相关问题 更多 >

    热门问题