Keras seq2seq padding - PullRequest
       36

Keras seq2seq padding

0 голосов
/ 12 мая 2018

Я работаю над seq2seq chatbot.Я бы спросил вас, как игнорировать символы PAD в ответах чат-ботов во время подсчета val_acc.

Например, моя модель генерирует ответ: [I, am, reading, a, book, PAD, PAD, PAD, PAD, PAD]

Но правильный ответ должен быть: [My, brother, is, playing, fotball,PAD, PAD, PAD, PAD, PAD].

В этом случае чат-бот ответил совершенно неправильно, но val_accна 50% из-за дополняющих символов.

Я использую Keras, модель кодера-декодера (https://blog.keras.io/a-ten-minute-introduction-to-sequence-to-sequence-learning-in-keras.html) с принудительной настройкой учителя

Мой код здесь:

encoder_inputs = Input(shape=(sentenceLength,), name="Encoder_input")
encoder = LSTM(n_units, return_state=True, name='Encoder_lstm')
Shared_Embedding = Embedding(output_dim=embedding, input_dim=vocab_size, name="Embedding", mask_zero='True') 
word_embedding_context = Shared_Embedding(encoder_inputs)
encoder_outputs, state_h, state_c = encoder(word_embedding_context)
encoder_states = [state_h, state_c]

decoder_inputs = Input(shape=(None,), name="Decoder_input")
decoder_lstm = LSTM(n_units, return_sequences=True, return_state=True, name="Decoder_lstm")

word_embedding_answer = Shared_Embedding(decoder_inputs)
decoder_outputs, _, _ = decoder_lstm(word_embedding_answer, initial_state=encoder_states)
decoder_dense = Dense(vocab_size, activation='softmax', name="Dense_layer")
decoder_outputs = decoder_dense(decoder_outputs)
model = Model([encoder_inputs, decoder_inputs], decoder_outputs)

Ввод энкодера - это предложение, где каждое слово является целым числом, а 0 - заполнение: [1,2,5,4,3,0,0,0] -> Вопрос пользователя. Вводом декодера также является предложение, где каждое слово является целым числом, 0 - этозаполнение и 100 - это символ GO: [100,8,4,2,0,0,0,0,0]] -> отклик чат-бота сдвинут на одну временную отметку. Вывод декодера - это предложение, где слова - целые числа, а эти целые числа - одна горячая.закодировано: [8,4,2,0,0,0,0,0, 0]] -> ответ чатбота (целые числа - одно горячее кодирование.)

Проблема в том, что val_acc слишком высок, такжемодель прогнозирует неправильные предложения. Я думаю, что это вызвано заполнением. Что-то не так с моей моделью? Нужно ли добавить еще одну маску кмой декодер?

Вот мои графики: enter image description here enter image description here

1 Ответ

0 голосов
/ 12 мая 2018

Вы правы, это потому, что в этом руководстве не используется Masking ( документация ) для игнорирования этих значений заполнения и показаны примеры равной длины входного вывода. В вашем случае модель все равно будет вводить вывод PAD, но маска будет игнорировать их. Например, чтобы замаскировать кодировщик:

# Define an input sequence and process it.
encoder_inputs = Input(shape=(None, num_encoder_tokens))
encoder_inputs = Masking()(encoder_inputs) # Assuming PAD is zeros
encoder = LSTM(latent_dim, return_state=True)
# Now the LSTM will ignore the PADs when encoding
# by skipping those timesteps that are masked
encoder_outputs, state_h, state_c = encoder(encoder_inputs)
...