向以函数 API 编写的 keras RNN 进行输入

Making inputs to keras RNN written in Functional API

我在使用用函数 API 编写的 keras RNN 进行掩蔽时遇到了一些问题。这个想法是用形状 (batch_size, timesteps, 100) 掩盖一个张量,零填充,并将其馈送到 SimpleRNN。现在我有以下内容:

input = keras.layers.Input(shape=(None, 100))

mask_layer = keras.layers.Masking(mask_value=0.)
mask = mask_layer(input)

rnn = keras.layers.SimpleRNN(20)
x = rnn(input, mask=mask)

但是,这不起作用,因为它引发了以下 InvalidArgumentError:

InvalidArgumentError: Dimension 1 in both shapes must be equal, but are 20 and 2000. Shapes are [?,20] and [?,2000]. for 'Select' (op: 'Select') with input shapes: [?,2000], [?,20], [?,20].

通过将输入的形状更改为 (None, 1) - 一个顺序输入,其中每个元素都是一个整数,而不是 n 维嵌入 - 我已经让这段代码起作用了。我也有同样的想法来使用 Sequential API,但我不能这样做,因为我的最终模型将有多个输入和输出。我也不想强制输入的形状为 (None, 1),因为我想在预处理期间交换不同的嵌入模型(Word2Vec 等),这意味着我的输入将从一开始就是嵌入向量.

谁能帮我在使用 keras 的函数式时使用带有 RNN 的掩码 API?

根据Masking and Padding with Keras,你不需要在RNN层上手动设置掩码,在下面的代码中RNN层会自动接收掩码。

import keras

input_layer = keras.layers.Input(shape=(None, 100))

masked_layer = keras.layers.Masking(mask_value=0.)(input_layer)

rnn_layer = keras.layers.SimpleRNN(20)(masked_layer)