Декодер не принимает вывод двунаправленного кодера - PullRequest
0 голосов
/ 28 января 2020

Я пытаюсь реализовать модель декодера кодера с Tensorflow. Энкодер является двунаправленной ячейкой.

def encoder(hidden_units, encoder_embedding, sequence_length):
    forward_cell = tf.contrib.rnn.LSTMCell(hidden_units)
    backward_cell = tf.contrib.rnn.LSTMCell(hidden_units)

    bi_outputs, final_states = tf.nn.bidirectional_dynamic_rnn(forward_cell, backward_cell, encoder_embedding, sequence_length= sequence_length, dtype=tf.float32)
    encoder_outputs = tf.concat(bi_outputs, 2)
    forward_cell_state, backward_cell_state =final_states
    cell_state_final = tf.concat([forward_cell_state.c, backward_cell_state.c],1)
    hidden_state_final = tf.concat([forward_cell_state.h, backward_cell_state.h],1)
    encoder_final_state = tf.nn.rnn_cell.LSTMStateTuple(c=cell_state_final, h=hidden_state_final)

    return encoder_outputs, encoder_final_state

Что-то пошло не так между энкодером и декодером. Я получаю сообщение об ошибке типа ValueError: формы (?, 42) и (12, 21) несовместимы ....

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

def decoder(decoder_embedding, vocab_size, hidden_units, sequence_length, encoder_output, encoder_state, batchsize):
    projection_layer = Dense(vocab_size)
    helper = tf.contrib.seq2seq.TrainingHelper(decoder_embedding, sequence_length=sequence_length)

    # Decoder
    decoder_cell = tf.contrib.rnn.LSTMCell(hidden_units)

    # Attention Mechanis
    attention_mechanism = tf.contrib.seq2seq.LuongAttention(hidden_units, encoder_output)
    attn_cell = tf.contrib.seq2seq.AttentionWrapper(decoder_cell, attention_mechanism, attention_layer_size=hidden_units)
    # Initial attention
    attn_zero = attn_cell.zero_state(batch_size=batchsize, dtype=tf.float32)
    ini_state = attn_zero.clone(cell_state=encoder_state)

    decoder = tf.contrib.seq2seq.BasicDecoder(cell=attn_cell, initial_state=ini_state, helper=helper, output_layer=projection_layer)
    decoder_outputs, _final_state, _final_sequence_lengths = tf.contrib.seq2seq.dynamic_decode(decoder)

    return decoder_outputs

Как это можно исправить?

1 Ответ

0 голосов
/ 29 января 2020

Проблема в том, что количество скрытых блоков кодера в два раза больше, чем у декодера, и вы пытаетесь привлечь внимание в стиле Luong. Он вычисляет энергии внимания (сходства состояний) как точечные произведения между состоянием декодера и всеми состояниями кодера, а точечное произведение требует одинаковой размерности.

У вас есть несколько вариантов:

  1. Используйте внимание в стиле Богданау с дополнительным нелинейным слоем в общем пространстве кодера-декодера.

  2. Измените размерность вашего кодера или декодера так, чтобы скрытый состояния будут одинаковыми, то есть hidden_units = 2 × кодера hidden_units

  3. добавит линейный плотный слой после выхода кодера, который будет проецировать выходы кодера в скрытый размер декодера .

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