Определение размера NMT и субтитров изображения с вниманием на стороне декодера - PullRequest
0 голосов
/ 17 апреля 2020

Я внимательно изучил модели в следующих уроках.

https://www.tensorflow.org/tutorials/text/nmt_with_attention

и

https://www.tensorflow.org/tutorials/text/image_captioning

В обоих уроках я не понимаю определяющую часть декодера.

в NMT с частью декодера внимания, как показано ниже,

class Decoder(tf.keras.Model):
  def __init__(self, vocab_size, embedding_dim, dec_units, batch_sz):
    super(Decoder, self).__init__()
    self.batch_sz = batch_sz
    self.dec_units = dec_units
    self.embedding = tf.keras.layers.Embedding(vocab_size, embedding_dim)
    self.gru = tf.keras.layers.GRU(self.dec_units,
                                   return_sequences=True,
                                   return_state=True,
                                   recurrent_initializer='glorot_uniform')
    self.fc = tf.keras.layers.Dense(vocab_size)

    # used for attention
    self.attention = BahdanauAttention(self.dec_units)

  def call(self, x, hidden, enc_output):
    # enc_output shape == (batch_size, max_length, hidden_size)
    context_vector, attention_weights = self.attention(hidden, enc_output)

    # x shape after passing through embedding == (batch_size, 1, embedding_dim)
    x = self.embedding(x)

    # x shape after concatenation == (batch_size, 1, embedding_dim + hidden_size)
    x = tf.concat([tf.expand_dims(context_vector, 1), x], axis=-1)

    # passing the concatenated vector to the GRU
    output, state = self.gru(x)

    # output shape == (batch_size * 1, hidden_size)
    output = tf.reshape(output, (-1, output.shape[2]))

    # output shape == (batch_size, vocab)
    x = self.fc(output)

    return x, state, attention_weights
  1. здесь выше, # x форма после прохождения встраивания == (batch_size, 1, embedding_dim) x = self.embedding (x). что должно быть х здесь? это просто целевой ввод?

  2. здесь выше, я не понимаю, почему форма вывода должна быть (batch_size * 1, hidden_size). почему batch_size * 1?

и часть декодера субтитров изображения, как показано ниже,

class RNN_Decoder(tf.keras.Model):
  def __init__(self, embedding_dim, units, vocab_size):
    super(RNN_Decoder, self).__init__()
    self.units = units

    self.embedding = tf.keras.layers.Embedding(vocab_size, embedding_dim)
    self.gru = tf.keras.layers.GRU(self.units,
                                   return_sequences=True,
                                   return_state=True,
                                   recurrent_initializer='glorot_uniform')
    self.fc1 = tf.keras.layers.Dense(self.units)
    self.fc2 = tf.keras.layers.Dense(vocab_size)

    self.attention = BahdanauAttention(self.units)

  def call(self, x, features, hidden):
    # defining attention as a separate model
    context_vector, attention_weights = self.attention(features, hidden)

    # x shape after passing through embedding == (batch_size, 1, embedding_dim)
    x = self.embedding(x)

    # x shape after concatenation == (batch_size, 1, embedding_dim + hidden_size)
    x = tf.concat([tf.expand_dims(context_vector, 1), x], axis=-1)

    # passing the concatenated vector to the GRU
    output, state = self.gru(x)

    # shape == (batch_size, max_length, hidden_size)
    x = self.fc1(output)

    # x shape == (batch_size * max_length, hidden_size)
    x = tf.reshape(x, (-1, x.shape[2]))

    # output shape == (batch_size * max_length, vocab)
    x = self.fc2(x)

    return x, state, attention_weights

  def reset_state(self, batch_size):
    return tf.zeros((batch_size, self.units))

, почему выходная форма должна быть изменена как (batch_size * max_length, hidden_size)?

Может кто-нибудь дать мне подробности?

Это мне очень поможет

1 Ответ

0 голосов
/ 17 апреля 2020

Причиной изменения формы является вызов полностью подключенного слоя, который в TensorFlow (в отличие от Pytorch) принимает только двумерные входные данные.

В первом примере предполагается метод декодера call. выполняется в течение 1 oop для каждого временного шага (как во время обучения, так и во время вывода). Но GRU требуется ввод в форме партия × длина × дим , и если вы называете это шаг за шагом, длина равна 1.

Во втором примере вы можете вызвать декодер во всей последовательности "земля-правда" во время обучения, но он все равно будет работать с длиной 1, поэтому вы можете использовать его в a для l oop во время вывода.

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