Керас-временная конкатенация с переменной длиной входной последовательности

Я работаю над реализацией модели, основанной на seq2seq, которая использует ячейки GRU вместо LSTM. Вот мой текущий код:

import constants
from keras.layers import Input, GRU, Dense, TimeDistributed, Dropout
from keras.models import Model
from keras.optimizers import RMSprop

encoder_input = Input(shape=(None,constants.EMBEDDING_SIZE))

encoder_1_output = GRU(constants.CONTEXT_VECTOR_SIZE, return_sequences=True, return_state=False, dropout=0.2)(
        encoder_input)
encoder_2_output = GRU(constants.CONTEXT_VECTOR_SIZE, return_sequences=True,
                           return_state=False, dropout=0.5)(
        encoder_1_output)
encoder_3_output = GRU(constants.CONTEXT_VECTOR_SIZE, return_sequences=True,
                           return_state=False, dropout=0.5)(
        encoder_2_output)
encoder_4_output, thought_vector = GRU(constants.CONTEXT_VECTOR_SIZE, return_sequences=False,
                                           return_state=True, dropout=0.5)(
        encoder_3_output)

decoder_inputs = Input(shape=(None, constants.CATEGORICAL_VECTOR_SIZE))
decoder_gru_1 = GRU(constants.CONTEXT_VECTOR_SIZE, return_sequences=True, return_state=True, dropout=0.3)
decoder_gru_2 = GRU(constants.CONTEXT_VECTOR_SIZE, return_sequences=True, return_state=True, dropout=0.5)
decoder_gru_3 = GRU(constants.CONTEXT_VECTOR_SIZE, return_sequences=True, return_state=True, dropout=0.5)
decoder_gru_4 = GRU(constants.CONTEXT_VECTOR_SIZE, return_sequences=True, return_state=True, dropout=0.5)

decoder_layer_1, decoder_state_1 = decoder_gru_1(decoder_inputs,
                                                     initial_state=thought_vector)
decoder_layer_2, decoder_state_2 = decoder_gru_2(decoder_layer_1)
decoder_layer_3, decoder_state_3 = decoder_gru_3(decoder_layer_2)
decoder_layer_4, decoder_state_4 = decoder_gru_4(decoder_layer_3)

dropout = Dropout(0.5)

categorical_decoder = Dense(constants.CATEGORICAL_VECTOR_SIZE, activation='softmax', use_bias=True)

decoder_dense = TimeDistributed(categorical_decoder)
decoder_output = decoder_dense(dropout(decoder_layer_4))

self._model = Model([encoder_input, decoder_inputs], decoder_output)
self._model.compile(optimizer=RMSprop(lr=0.15, decay=0.9), 
loss="categorical_crossentropy", metrics=["acc"])

Однако проблема, с которой я сталкиваюсь, заключается в том, что я хотел бы, чтобы каждый вход (шаг по времени), который подается в decoder_gru_1, был конкатенирован с мыслью_вектором. Я старался изо всех сил со слоем Concatenate и Timedistributed. Если бы длина последовательности decoder_inputs была постоянной, я бы использовал вектор повторения. В этом случае, однако, я не смог найти решение, работающее для входов переменной длины.

Чтобы прояснить ситуацию, допустим, что у меня есть последовательность [[1,2,3],[5,6,7]] и мысленный_вектор, равный [10,10,10]. В качестве ввода decoder_gru_1 я хотел бы иметь [[1,2,3,10,10,10],[5,6,7,10,10,10]]. Можно ли добиться этого в Керасе?

0 ответов

Другие вопросы по тегам