Модель вывода LSTM Encoder-Decoder - PullRequest
2 голосов
/ 22 апреля 2019

Многие учебные пособия по архитектуре кодера-декодера seq2seq на основе LSTM (например, перевод с английского на французский) определяют модель следующим образом:

encoder_inputs = Input(shape=(None,))
en_x=  Embedding(num_encoder_tokens, embedding_size)(encoder_inputs)

# Encoder lstm
encoder = LSTM(50, return_state=True)
encoder_outputs, state_h, state_c = encoder(en_x)

# We discard `encoder_outputs` and only keep the states.
encoder_states = [state_h, state_c]

# Set up the decoder, using `encoder_states` as initial state.
decoder_inputs = Input(shape=(None,))

# french word embeddings
dex=  Embedding(num_decoder_tokens, embedding_size)
final_dex= dex(decoder_inputs)

# decoder lstm
decoder_lstm = LSTM(50, return_sequences=True, return_state=True)
decoder_outputs, _, _ = decoder_lstm(final_dex,
                                     initial_state=encoder_states)

decoder_dense = Dense(num_decoder_tokens, activation='softmax')
decoder_outputs = decoder_dense(decoder_outputs)

# While training, model takes eng and french words and outputs #translated french word
fullmodel = Model([encoder_inputs, decoder_inputs], decoder_outputs)

# rmsprop is preferred for nlp tasks
fullmodel.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['acc'])

fullmodel.fit([encoder_input_data, decoder_input_data], decoder_target_data,
          batch_size=128,
          epochs=100,
          validation_split=0.20)

Затем для прогнозирования они определяют модели вывода следующим образом:

# define the encoder model 
encoder_model = Model(encoder_inputs, encoder_states)
encoder_model.summary()


# Redefine the decoder model with decoder will be getting below inputs from encoder while in prediction
decoder_state_input_h = Input(shape=(50,))
decoder_state_input_c = Input(shape=(50,))
decoder_states_inputs = [decoder_state_input_h, decoder_state_input_c]
final_dex2= dex(decoder_inputs)

decoder_outputs2, state_h2, state_c2 = decoder_lstm(final_dex2, initial_state=decoder_states_inputs)

decoder_states2 = [state_h2, state_c2]
decoder_outputs2 = decoder_dense(decoder_outputs2)

# sampling model will take encoder states and decoder_input(seed initially) and output the predictions(french word index) We dont care about decoder_states2
decoder_model = Model(
    [decoder_inputs] + decoder_states_inputs,
    [decoder_outputs2] + decoder_states2)

Затем спрогнозируйте, используя:

# Reverse-lookup token index to decode sequences back to
# something readable.
reverse_input_char_index = dict(
    (i, char) for char, i in input_token_index.items())
reverse_target_char_index = dict(
    (i, char) for char, i in target_token_index.items())


def decode_sequence(input_seq):
    # Encode the input as state vectors.
    states_value = encoder_model.predict(input_seq)

    # Generate empty target sequence of length 1.
    target_seq = np.zeros((1,1))
    # Populate the first character of target sequence with the start character.
    target_seq[0, 0] = target_token_index['START_']

   # Sampling loop for a batch of sequences
    # (to simplify, here we assume a batch of size 1).
    stop_condition = False
    decoded_sentence = ''
    while not stop_condition:
        output_tokens, h, c = decoder_model.predict(
            [target_seq] + states_value)

        # Sample a token
        sampled_token_index = np.argmax(output_tokens[0, -1, :])
        sampled_char = reverse_target_char_index[sampled_token_index]
        decoded_sentence += ' '+sampled_char

        # Exit condition: either hit max length
        # or find stop character.
        if (sampled_char == '_END' or
           len(decoded_sentence) > 52):
            stop_condition = True

       # Update the target sequence (of length 1).
        target_seq = np.zeros((1,1))
        target_seq[0, 0] = sampled_token_index

        # Update states
        states_value = [h, c]
return decoded_sentence

Мой вопрос заключается в том, что они обучили модель с именем 'fullmodel', чтобы получить лучшие веса ... в части прогнозирования, они использовалиМодели логического вывода с именами (encoder_model & decoder_model) ... поэтому они не использовали весовые коэффициенты от 'fullmodel'?!

Я не понимаю, как они получают выгоду от обученной модели!

Ответы [ 2 ]

1 голос
/ 30 мая 2019

Если вы внимательно обратите внимание, то веса обученного слоя используются повторно. Например, при создании decoder_model мы используем слой decoder_lstm, который был определен как часть полной модели, decoder_outputs2, state_h2, state_c2 = decoder_lstm (final_dex2, initial_state = decoder_states_inputs),

, а модель энкодера также использует слой encoder_inputs и encoder_states, определенный ранее. encoder_model = Модель (encoder_inputs, encoder_states)

Из-за архитектуры модели кодер-декодер нам необходимо выполнить эти реализации хаков. Также, как упоминается в документации keras, с помощью функционального API легко использовать обученные модели: вы можете рассматривать любую модель как слой, вызывая ее для тензора. Обратите внимание, что, вызывая модель, вы не просто повторно используете архитектуру модели, вы также повторно используете ее веса . За более подробной информацией обращайтесь - https://keras.io/getting-started/functional-api-guide/#all-models-are-callable-just-like-layers

1 голос
/ 23 апреля 2019

Хитрость в том, что все находится в одной области видимости переменных, поэтому переменные используются повторно.

...