Слой RNN с неравной длиной входа и выхода в TF / Keras - PullRequest
0 голосов
/ 20 апреля 2020

Можно ли получить переменную длину вывода из RNN, т.е. input_seq_length! = Output_seq_length?

Вот пример, показывающий форму вывода LSTM, test_rnn_output_v1 настройки по умолчанию - возвращать только выходные данные для последнего шага, test_rnn_output_v2 вернуть вывод для всех шагов, т.е. мне нужно что-то вроде test_rnn_output_v2, но с выходной формой (None, variable_seq_length, rnn_dim) или, по крайней мере, (None, max_output_seq_length, rnn_dim).

from keras.layers import Input
from keras.layers import LSTM
from keras.models import Model


def test_rnn_output_v1():
    max_seq_length = 10
    n_features = 4
    rnn_dim = 64

    input = Input(shape=(max_seq_length, n_features))
    out = LSTM(rnn_dim)(input)

    model = Model(inputs=[input], outputs=out)

    print(model.summary())

    # (None, max_seq_length, n_features)
    # (None, rnn_dim)


def test_rnn_output_v2():
    max_seq_length = 10
    n_features = 4
    rnn_dim = 64

    input = Input(shape=(max_seq_length, n_features))
    out = LSTM(rnn_dim, return_sequences=True)(input)

    model = Model(inputs=[input], outputs=out)

    print(model.summary())

    # (None, max_seq_length, n_features)
    # (None, max_seq_length, rnn_dim)


test_rnn_output_v1()
test_rnn_output_v2()

1 Ответ

1 голос
/ 21 апреля 2020

Слой RNN по определению не может иметь неравную длину входа и выхода. Однако есть хитрость для достижения неравной, но фиксированной выходной длины, используя два слоя RNN и слой RepeatVector между ними. Вот минимальный пример модели, которая принимает входные последовательности переменной длины и создает выходные последовательности с фиксированной и произвольной длиной:

import tensorflow as tf

max_output_length = 35

inp = tf.keras.layers.Input(shape=(None, 10))
x = tf.keras.layers.LSTM(20)(inp)
x = tf.keras.layers.RepeatVector(max_output_length)(x)
out = tf.keras.layers.LSTM(30, return_sequences=True)(x)

model = tf.keras.Model(inp, out)
model.summary()

Вот сводка модели:

Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         [(None, None, 10)]        0         
_________________________________________________________________
lstm (LSTM)                  (None, 20)                2480      
_________________________________________________________________
repeat_vector (RepeatVector) (None, 35, 20)            0         
_________________________________________________________________
lstm_1 (LSTM)                (None, 35, 30)            6120      
=================================================================
Total params: 8,600
Trainable params: 8,600
Non-trainable params: 0
_________________________________________________________________

Эта структура может использоваться в моделях от последовательности к последовательности, в которых длина входных последовательностей может не совпадать с длиной выходных последовательностей.

...