2016-03-23 8 views
0

Я прошел через код, и я боялся, что не пойму важный момент.Массы моделей Seq2Seq

Я не могу найти матрицу весов модели для кодировщика и декодера, ни там, где они обновляются. Я нашел target_weights, но он, кажется, повторно инициализируется при каждом вызове get_batch(), поэтому я не понимаю, для чего они стоят.

Моя фактическая цель состоит в том, чтобы объединить два скрытых состояния двух исходных кодеров для одного декодера, применяя линейное преобразование с весовой матрицей, которое мне нужно будет обучать вместе с моделью (im, построив многотоновую модель), но i не знаю, с чего начать, из-за моей проблемы, упомянутой выше.

Я благодарю вас за любую помощь, которую вы могли бы предоставить.

BG

ответ

1

Это может помочь вам начать работу. Есть пара моделей, реализованных в tensorflow.python.ops.seq2seq.py (с/без ведер, внимание и т. Д.), Но посмотрите на определение для embedding_attention_seq2seq (которое называется в их примере модели seq2seq_model.py, которое вы, кажется, ссылаетесь):

def embedding_attention_seq2seq(encoder_inputs, decoder_inputs, cell, 
           num_encoder_symbols, num_decoder_symbols, 
           num_heads=1, output_projection=None, 
           feed_previous=False, dtype=dtypes.float32, 
           scope=None, initial_state_attention=False): 

    with variable_scope.variable_scope(scope or "embedding_attention_seq2seq"): 
    # Encoder. 
    encoder_cell = rnn_cell.EmbeddingWrapper(cell, num_encoder_symbols) 
    encoder_outputs, encoder_state = rnn.rnn(
     encoder_cell, encoder_inputs, dtype=dtype) 

    # First calculate a concatenation of encoder outputs to put attention on. 
    top_states = [array_ops.reshape(e, [-1, 1, cell.output_size]) 
        for e in encoder_outputs] 
    attention_states = array_ops.concat(1, top_states) 
    .... 

Вы можете увидеть, где он выбирает верхний уровень выходов энкодера как top_states, прежде чем передавать их декодеру.

Таким образом, вы можете реализовать аналогичную функцию с двумя кодировщиками и объединить эти состояния перед передачей в декодер.

+0

Спасибо за ваш ответ. Это именно то, что я делаю сейчас :-) Но мои вопросы касались управления весами, которое все еще немного сбивает меня с толку. Наверное, мне просто нужно будет проверить и посмотреть. Хорошего дня. –

1

Значение, созданное в функции get_batch, используется только для первой итерации. Несмотря на то, что веса передаются каждый раз в функцию, их значение обновляется как глобальная переменная в классе модели Seq2Seq в функции init.

with tf.name_scope('Optimizer'): 
     # Gradients and SGD update operation for training the model. 
     params = tf.trainable_variables() 
     if not forward_only: 
      self.gradient_norms = [] 
      self.updates = [] 
      opt = tf.train.GradientDescentOptimizer(self.learning_rate) 
      for b in range(len(buckets)): 
       gradients = tf.gradients(self.losses[b], params) 
       clipped_gradients, norm = tf.clip_by_global_norm(gradients, 
                   max_gradient_norm) 
       self.gradient_norms.append(norm) 
       self.updates.append(opt.apply_gradients(
        zip(clipped_gradients, params), global_step=self.global_step)) 

    self.saver = tf.train.Saver(tf.global_variables()) 

Веса подают отдельно в качестве места держателя, потому что они нормализуются функции get_batch для создания нулевых весов для входов PAD.

# Batch decoder inputs are re-indexed decoder_inputs, we create weights. 
    for length_idx in range(decoder_size): 
     batch_decoder_inputs.append(
      np.array([decoder_inputs[batch_idx][length_idx] 
         for batch_idx in range(self.batch_size)], dtype=np.int32)) 

     # Create target_weights to be 0 for targets that are padding. 
     batch_weight = np.ones(self.batch_size, dtype=np.float32) 
     for batch_idx in range(self.batch_size): 
      # We set weight to 0 if the corresponding target is a PAD symbol. 
      # The corresponding target is decoder_input shifted by 1 forward. 
      if length_idx < decoder_size - 1: 
       target = decoder_inputs[batch_idx][length_idx + 1] 
      if length_idx == decoder_size - 1 or target == data_utils.PAD_ID: 
       batch_weight[batch_idx] = 0.0 
     batch_weights.append(batch_weight) 

 Смежные вопросы

  • Нет связанных вопросов^_^