在 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
假设我有一些形状为 (?, 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