首页 > 解决方案 > 对用功能 API 编写的 keras RNN 进行输入

问题描述

我在使用功能 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:两个形状中的维度 1 必须相等,但分别为 20 和 2000。形状为 [?,20] 和 [?,2000]。对于具有输入形状的“选择”(操作:“选择”):[?,2000]、[?,20]、[?,20]。

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

在使用 keras 的功能 API 时,谁能帮助我使用带有 RNN 的掩码?

标签: pythontensorflowkerasmasking

解决方案


根据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)

推荐阅读