Как мне установить начальное состояние экземпляра keras.layers.RNN? - PullRequest
0 голосов
/ 07 февраля 2019

Я создал модель декодера с накоплением keras, используя следующую петлю:

# Create the encoder
# Define an input sequence.
encoder_inputs = keras.layers.Input(shape=(None, num_input_features))

# Create a list of RNN Cells, these are then concatenated into a single layer with the RNN layer.
encoder_cells = []
for hidden_neurons in hparams['encoder_hidden_layers']:
    encoder_cells.append(keras.layers.GRUCell(hidden_neurons,
                                              kernel_regularizer=regulariser,
                                              recurrent_regularizer=regulariser,
                                              bias_regularizer=regulariser))

encoder = keras.layers.RNN(encoder_cells, return_state=True)

encoder_outputs_and_states = encoder(encoder_inputs)

# Discard encoder outputs and only keep the states. The outputs are of no interest to us, the encoder's job is to create 
# a state describing the input sequence.
encoder_states = encoder_outputs_and_states[1:]
print(encoder_states)
if hparams['encoder_hidden_layers'][-1] != hparams['decoder_hidden_layers'][0]:
    encoder_states = Dense(hparams['decoder_hidden_layers'][0])(encoder_states[-1])

# Create the decoder, the decoder input will be set to zero
decoder_inputs = keras.layers.Input(shape=(None, 1))

decoder_cells = []
for hidden_neurons in hparams['decoder_hidden_layers']:
    decoder_cells.append(keras.layers.GRUCell(hidden_neurons,
                                              kernel_regularizer=regulariser,
                                              recurrent_regularizer=regulariser,
                                              bias_regularizer=regulariser))

decoder = keras.layers.RNN(decoder_cells, return_sequences=True, return_state=True)

# Set the initial state of the decoder to be the output state of the encoder. his is the fundamental part of the 
# encoder-decoder.
decoder_outputs_and_states = decoder(decoder_inputs, initial_state=encoder_states)

# Only select the output of the decoder (not the states)
decoder_outputs = decoder_outputs_and_states[0]

# Apply a dense layer with linear activation to set output to correct dimension and scale (tanh is default activation for
# GRU in Keras
decoder_dense = keras.layers.Dense(num_output_features,
                                   activation='linear',
                                   kernel_regularizer=regulariser,
                                   bias_regularizer=regulariser)

decoder_outputs = decoder_dense(decoder_outputs)

model = keras.models.Model(inputs=[encoder_inputs, decoder_inputs], outputs=decoder_outputs)
model.compile(optimizer=optimiser, loss=loss)
model.summary()

Эта настройка работает, когда у меня есть однослойный кодер и однослойный декодер, где число нейронов одинаково.Однако это не работает, когда количество слоев декодера больше одного.

Я получаю следующее сообщение об ошибке:

ValueError: An `initial_state` was passed that is not compatible with `cell.state_size`. Received `state_spec`=[InputSpec(shape=(None, 48), ndim=2)]; however `cell.state_size` is (48, 58)

Мой список decoder_layers содержит записи [48, 58].Поэтому мой уровень RNN, из которого состоит декодер, представляет собой стекированный GRU, где первый GRU содержит 48 нейронов, а второй содержит 58. Я хотел бы установить начальное состояние первого GRU.Я запускаю состояния через плотный слой, чтобы форма была совместима с первым слоем декодера.Сообщение об ошибке указывает, что я пытаюсь установить начальное состояние как первого уровня, так и второго уровня, когда я передаю ключевое слово начального состояния на уровень RNN декодера.Это правильное поведение?Обычно я бы устанавливал начальное состояние первого слоя декодера (не построенного с использованием структуры ячеек, подобной этой), которая затем просто передавала бы свои входные данные в последующие слои.Есть ли способ добиться такого поведения в keras по умолчанию при создании keras.layers.RNN из списка GRUCell из LSTMCells?

1 Ответ

0 голосов
/ 24 апреля 2019

В моих собственных экспериментах ваш intial_states должен иметь batch_size в качестве первого измерения.Другими словами, каждый элемент в одном пакете может иметь различное начальное состояние.Из вашего кода, я думаю, вы пропустили это измерение.

...