Как проверить модель, обученную с помощью принуждения учителя - PullRequest
0 голосов
/ 27 июня 2019

Я использовал keras для обучения модели seq2seq (keras.models.Model). X и y модели - [X_encoder, X_decoder] и y, т. Е. Список входов и меток кодера и декодера ( Обратите внимание , что на входе декодера, X_decoder равен 'y', на одну позицию впереди фактического г. В основном учитель заставляет).

Итак, мой вопрос теперь после обучения, когда речь идет о реальном прогнозировании, когда у меня нет меток, как я могу предоставить ‘X_decoder’ для моего ввода? Или я тренируюсь на чем-то другом?

Это фрагмент определения модели, если он вообще помогает:)

# Encoder
encoder_inputs = Input(batch_shape=(batch_size, max_len,), dtype='int32')
encoder_embedding = embedding_layer(encoder_inputs)
encoder_LSTM = CuDNNLSTM(hidden_dim, return_state=True, stateful=True)
encoder_outputs, state_h, state_c = encoder_LSTM(encoder_embedding)

# Decoder
decoder_inputs = Input(shape=(max_len,), dtype='int32')
decoder_embedding = embedding_layer(decoder_inputs)
decoder_LSTM = CuDNNLSTM(hidden_dim, return_state=True, return_sequences=True)
decoder_outputs, _, _ = decoder_LSTM(decoder_embedding, initial_state=[state_h, state_c])

# Output
outputs = TimeDistributed(Dense(vocab_size, activation='softmax'))(decoder_outputs)
model = Model([encoder_inputs, decoder_inputs], outputs)

# model fitting:
model.fit([X_encoder, X_decoder], y, steps_per_epoch=int(number_of_train_samples/batch_size),
epochs=epochs)

1 Ответ

2 голосов
/ 29 июня 2019

Обычно при обучении модели seq2seq первым токеном decoder_inputs является специальный токен <start>. Поэтому, когда вы пытаетесь сгенерировать предложение, вы делаете это как

first_token = decoder(encoder_state, [<start>])
second_token = decoder(encoder_state, [<start>, first_token])
third_token = decoder(encoder_state, [<start>, first_token, second_token])
...

Вы выполняете эту рекурсию, пока ваш декодер не сгенерирует другой специальный токен - <end>; тогда вы остановитесь.

Вот очень грубый python-декодер для вашей модели. Он неэффективен, потому что он читает ввод снова и снова, а не запоминает состояние RNN - но он работает.

input_seq = # some array of token indices
result = np.array([[START_TOKEN]])
next_token = -1
for i in range(100500):
    next_token = model.predict([input_seq, result])[0][-1].argmax()
    if next_token == END_TOKEN:
        break
    result = np.concatenate([result, [[next_token]]], axis=1)
output_seq = result[0][1:] # omit the first INPUT_TOKEN

Более эффективное решение будет выводить состояние RNN вместе с каждым токеном и использовать его для создания следующего токена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...