2016-04-02 3 views
6

Я пытался вставить предварительно обработанные векторы word2vec в существующую модель тензорного потока seq2seq.Инъекция предварительно обученных векторов word2vec в TensorFlow seq2seq

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

В моем понимании ошибка может быть связана с тем, что EmbeddingWrapper или embedding_attention_decoder создают вложения независимо от порядка словарного запаса?

Что было бы лучшим способом загрузить предварительно обработанные векторы в модель тензорного потока?

SOURCE_EMBEDDING_KEY = "embedding_attention_seq2seq/RNN/EmbeddingWrapper/embedding" 
TARGET_EMBEDDING_KEY = "embedding_attention_seq2seq/embedding_attention_decoder/embedding" 


def inject_pretrained_word2vec(session, word2vec_path, input_size, dict_dir, source_vocab_size, target_vocab_size): 
    word2vec_model = word2vec.load(word2vec_path, encoding="latin-1") 
    print("w2v model created!") 
    session.run(tf.initialize_all_variables()) 

    assign_w2v_pretrained_vectors(session, word2vec_model, SOURCE_EMBEDDING_KEY, source_vocab_path, source_vocab_size) 
    assign_w2v_pretrained_vectors(session, word2vec_model, TARGET_EMBEDDING_KEY, target_vocab_path, target_vocab_size) 


def assign_w2v_pretrained_vectors(session, word2vec_model, embedding_key, vocab_path, vocab_size): 
    vectors_variable = [v for v in tf.trainable_variables() if embedding_key in v.name] 
    if len(vectors_variable) != 1: 
     print("Word vector variable not found or too many. key: " + embedding_key) 
     print("Existing embedding trainable variables:") 
     print([v.name for v in tf.trainable_variables() if "embedding" in v.name]) 
     sys.exit(1) 

    vectors_variable = vectors_variable[0] 
    vectors = vectors_variable.eval() 

    with gfile.GFile(vocab_path, mode="r") as vocab_file: 
     counter = 0 
     while counter < vocab_size: 
      vocab_w = vocab_file.readline().replace("\n", "") 
      # for each word in vocabulary check if w2v vector exist and inject. 
      # otherwise dont change the value. 
      if word2vec_model.__contains__(vocab_w): 
       w2w_word_vector = word2vec_model.get_vector(vocab_w) 
       vectors[counter] = w2w_word_vector 
      counter += 1 

    session.run([vectors_variable.initializer], 
      {vectors_variable.initializer.inputs[1]: vectors}) 

ответ

5

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

Где вы строите вас Graph:

with tf.device("/cpu:0"): 
    embedding = tf.get_variable("embedding", [vocabulary_size, embedding_size])  
    inputs = tf.nn.embedding_lookup(embedding, input_data) 

Когда ты выполните (после построения графика и перед началом обучения) просто присвойте сохраненные вложения переменной встраивания:

session.run(tf.assign(embedding, embeddings_that_you_want_to_use)) 

Идея состоит в том, что embedding_lookup заменит значения input_data теми, что присутствуют в переменной embedding.