在 Keras 的批处理中处理可变长度的序列

Processing sequences of variable length within a batch in Keras

假设我有一些形状为 (?, 10) 的数据。

即数据的特征是变长的序列,序列的每个元素用10个数字表示。

我们想将其提供给 LSTM,因此我们准备每个批次的长度为 (32, m, 10),其中 m 是批次中示例的最大序列长度。

batch内序列长度小于m的样本补零

现在,我们想将其提供给 LSTM,我们希望 LSTM 停止更新填充输入的输出。

在 Tensorflow 中,这将通过其 dynamic_rnn 的参数 sequence_length 来完成。

如何在 Keras 中实现相同的效果?

您需要使用 Masking 来生成 掩码 以允许 LSTM 跳过这些填充值。来自文档:

model = Sequential()
model.add(Masking(mask_value=0., input_shape=(None, 10)))
model.add(LSTM(32))

上面的 LSTM 现在将跳过所有 10 个特征都被 0 填充的时间步。 注意:如果您要返回序列,则将返回之前的隐藏状态:

x = [2, 0, 1, 0] # for example
# will produce
y = [h1, h1, h2, h2] # so 0 pads are skipped
# but returning sequences repeats the last hidden state for masked values