Ввод данных в keras RNN, написанный на Functional API - PullRequest
1 голос
/ 25 января 2020

У меня возникли некоторые проблемы с маскировкой RNN, написанной на Functional API. Идея состоит в том, чтобы замаскировать тензор с добавлением нуля формой (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]. для 'Select' (op: 'Select') с формами ввода: [?, 2000], [?, 20], [?, 20].

Путем изменения формы моего ввода на (None, 1) - последовательный ввод, в котором каждый элемент представляет собой одно целое число вместо n-мерных вложений - я получил этот код для работы. Я также получил ту же идею работать с последовательным API, но я не могу этого сделать, так как моя окончательная модель будет иметь несколько входов и выходов. Я также не хочу, чтобы форма моего Входного элемента была (Нет, 1), поскольку я хочу поменять различные модели встраивания (Word2Ve c, et c) во время предварительной обработки, что означает, что мои входные данные будут встраивать векторы из начало.

Кто-нибудь может мне помочь с использованием масок с RNN при использовании функционального API-интерфейса keras?

1 Ответ

0 голосов
/ 25 января 2020

Согласно 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)
...