2016-06-06 9 views
4

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

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

Однако мне действительно не ясно, как это может быть.

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

Любая помощь в выяснении способов доступа к ним была бы весьма признательна.

ответ

5

Как и все операции Tensorflow, большинство переменных динамически создаются. Существуют различные способы доступа к этим переменным (и их значениям). Здесь интересующая вас переменная является частью набора обучаемых переменных. Для доступа к ним, мы можем, таким образом, использовать tf.trainable_variables() функцию:

for var in tf.trainable_variables(): 
    print var.name 

, который даст нам - для модели seq2seq ГРУ, следующий список:

embedding_rnn_seq2seq/RNN/EmbeddingWrapper/embedding:0 
embedding_rnn_seq2seq/RNN/GRUCell/Gates/Linear/Matrix:0 
embedding_rnn_seq2seq/RNN/GRUCell/Gates/Linear/Bias:0 
embedding_rnn_seq2seq/RNN/GRUCell/Candidate/Linear/Matrix:0 
embedding_rnn_seq2seq/RNN/GRUCell/Candidate/Linear/Bias:0 
embedding_rnn_seq2seq/embedding_rnn_decoder/embedding:0 
embedding_rnn_seq2seq/embedding_rnn_decoder/rnn_decoder/GRUCell/Gates/Linear/Matrix:0 
embedding_rnn_seq2seq/embedding_rnn_decoder/rnn_decoder/GRUCell/Gates/Linear/Bias:0 
embedding_rnn_seq2seq/embedding_rnn_decoder/rnn_decoder/GRUCell/Candidate/Linear/Matrix:0 
embedding_rnn_seq2seq/embedding_rnn_decoder/rnn_decoder/GRUCell/Candidate/Linear/Bias:0 
embedding_rnn_seq2seq/embedding_rnn_decoder/rnn_decoder/OutputProjectionWrapper/Linear/Matrix:0 
embedding_rnn_seq2seq/embedding_rnn_decoder/rnn_decoder/OutputProjectionWrapper/Linear/Bias:0 

Это говорит нам о том, что вложение называется embedding_rnn_seq2seq/RNN/EmbeddingWrapper/embedding:0 , который мы можем использовать, чтобы получить указатель на этот переменный в нашем предыдущем итераторе:

for var in tf.trainable_variables(): 
    print var.name 
    if var.name == 'embedding_rnn_seq2seq/RNN/EmbeddingWrapper/embedding:0': 
     embedding_op = var 

Это мы можем пройти вместе с другим вупом нашей сессии -run:

_, loss_t, summary, embedding = sess.run([train_op, loss, summary_op, embedding_op], feed_dict) 

и мы имеем перед собой (пакетный список) вложений ...

0

Существует родственный post, но он основан на tensorflow-0,6, который является довольно устаревшей. Поэтому я обновляю его ответ в fiforflow-0.8, который также похож на тот, что и в самой новой версии.

(* представляют где изменить)

losses = [] 
outputs = [] 
*states = [] 
with ops.op_scope(all_inputs, name, "model_with_buckets"): 
    for j, bucket in enumerate(buckets): 
     with variable_scope.variable_scope(variable_scope.get_variable_scope(), 
                      reuse=True if j > 0 else None): 
      *bucket_outputs, _ ,bucket_states= seq2seq(encoder_inputs[:bucket[0]], 
                    decoder_inputs[:bucket[1]]) 
      outputs.append(bucket_outputs) 
      if per_example_loss: 
       losses.append(sequence_loss_by_example(
         outputs[-1], targets[:bucket[1]], weights[:bucket[1]], 
         softmax_loss_function=softmax_loss_function)) 
      else: 
       losses.append(sequence_loss(
        outputs[-1], targets[:bucket[1]], weights[:bucket[1]], 
        softmax_loss_function=softmax_loss_function)) 

return outputs, losses, *states 

на Python/OPS/seq2seq, изменять embedding_attention_seq2seq()

if isinstance(feed_previous, bool): 
    *outputs, states = embedding_attention_decoder(
       decoder_inputs, encoder_state, attention_states, cell, 
       num_decoder_symbols, embedding_size, num_heads=num_heads, 
       output_size=output_size, output_projection=output_projection, 
       feed_previous=feed_previous, 
       initial_state_attention=initial_state_attention) 
    *return outputs, states, encoder_state 

    # If feed_previous is a Tensor, we construct 2 graphs and use cond. 
def decoder(feed_previous_bool): 
    reuse = None if feed_previous_bool else True 
    with variable_scope.variable_scope(variable_scope.get_variable_scope(),reuse=reuse): 
     outputs, state = embedding_attention_decoder(
       decoder_inputs, encoder_state, attention_states, cell, 
       num_decoder_symbols, embedding_size, num_heads=num_heads, 
       output_size=output_size, output_projection=output_projection, 
       feed_previous=feed_previous_bool, 
       update_embedding_for_previous=False, 
       initial_state_attention=initial_state_attention) 
     return outputs + [state] 

    outputs_and_state = control_flow_ops.cond(feed_previous, lambda: decoder(True), lambda: decoder(False))                                       
    *return outputs_and_state[:-1], outputs_and_state[-1], encoder_state 

в модели/РНН/перевод/seq2seq_model.py изменить Init()

if forward_only: 
    *self.outputs, self.losses, self.states= tf.nn.seq2seq.model_with_buckets(
      self.encoder_inputs, self.decoder_inputs, targets, 
      self.target_weights, buckets, lambda x, y: seq2seq_f(x, y, True), 
      softmax_loss_function=softmax_loss_function) 
    # If we use output projection, we need to project outputs for decoding. 
    if output_projection is not None: 
     for b in xrange(len(buckets)): 
      self.outputs[b] = [ 
        tf.matmul(output, output_projection[0]) + output_projection[1] 
        for output in self.outputs[b] 
      ] 
else: 
    *self.outputs, self.losses, _ = tf.nn.seq2seq.model_with_buckets(
      self.encoder_inputs, self.decoder_inputs, targets, 
      self.target_weights, buckets, 
      lambda x, y: seq2seq_f(x, y, False), 
      softmax_loss_function=softmax_loss_function) 

в модели/РНН/переводить/seq2seq_model.py изменить шаг()

if not forward_only: 
    return outputs[1], outputs[2], None # Gradient norm, loss, no outputs. 
else: 
    *return None, outputs[0], outputs[1:], outputs[-1] # No gradient norm, loss, outputs. 

со всем этим делать, мы можем получить закодированные состояния по телефону:

_, _, output_logits, states = model.step(sess, encoder_inputs, decoder_inputs, 
                    target_weights, bucket_id, True) 
print (states) 

в translate.py.