在 Keras 功能 api 中训练不同序列长度的 LSTM

数据挖掘 神经网络 深度学习 喀拉斯 lstm rnn
2022-02-21 17:10:45

我正在尝试使用 Keras 功能 API 训练 LSTM 模型。我的训练数据是形状:

>>> data.shape()
(100000,variable_sequence_lengths,295)

其中 100000 对应于实例数(序列的整数),295 表示给定序列的每个元素中的特征数。

我收到有关输入数据形状的错误。考虑到可变序列长度,如何定义输入层和后续层(LSTM)中数据的形状?

from keras.layers import Input, Dense, concatenate, LSTM
from keras.models import Model
import numpy as np

inputs = Input(shape=(x,y,z))
x=LSTM(128, return_sequences=True, input_shape=(a,b,c))(inputs)
....

x、y、za、b、c应该取什么值

3个回答

型号规格为每个样品,样品数量不应包含在尺寸中,即(a, b, c)(sample_size, timesteps, dimension)应更改为(timesteps, dimension)此外,对于可变长度序列,timesteps应该是None. 也就是说,(timesteps, dimension)应该是(None, 295)也是如此(x, y, z)

请查看这篇文章,了解如何将可变长度多维序列提供给 Keras LSTM。

在 Keras 函数式 API 中,您只能使用一个 Input 函数,如下所述。如果您使用过 Input,则不要在 LSTM 层中提及输入形状。

from keras.layers import Input, Dense, concatenate, LSTM
from keras.models import Model
import numpy as np

# 64 = batch size
# 128 = sequence length
# 295 = number of features

inputs = Input(shape = (64, 128, 295))
x = LSTM(128, return_sequences = True)(inputs)

过去我曾想过这个问题。但是从我能够确定的一切来看,实际上不可能对同一个网络有不同的输入大小。例如,如果您有一个长度为 300 的序列和一个长度为 500 的序列,要将它们用作同一网络中的输入,您将不得不通过以某种方式填充它的末端来扩展较小序列的长度,或者分解较长的一个变成较小的子序列。如果您绝对必须使用不同长度的输入,并且不能使用这两种方法中的任何一种,您可能需要切换到隐马尔可夫模型,该模型使用转移概率进行预测,可以使用先验概率进行当前预测,并将对输入到它的任何长度序列的预测。这仍然是大多数长序列遗传学工具的事实标准。

但是,您可能会尝试的另一种方法,特别是如果您对序列标记感兴趣而不仅仅是序列分类,是使用自然语言处理风格,即在目标周围设置一个上下文窗口。您通过网络运行子序列,然后使用新的上下文窗口将窗口滑过一个。非常耗时,但有可能非常有效。