2016-07-31 23 views
0

我需要在Tensorflow中運行編碼器 - 解碼器模型。我發現使用可用的API basic_rnn_seq2seq(encoder_input_data, decoder_input_data, lstm_cell)等,可以創建編碼器 - 解碼器系統。如何在Tensorflow中運行自定義seq2seq學習(使用預先計算的字嵌入)編碼器 - 解碼器?

  1. 如何在這樣的模型中輸入如word2vec的嵌入?我是 意識到我們可以做嵌入式查找,但根據API encoder_input_data是一個大小爲batch_size x input_size的2D張量的列表。每個單詞如何使用它在這個設置中嵌入的單詞來表示?即使embedding_rnn_seq2seq在內部也會提取嵌入。如何將預先計算的單詞嵌入作爲輸入?
  2. 我們如何通過API獲得成本/困惑?
  3. 在測試實例的情況下,我們可能不知道相應的解碼器輸入。如何處理這種情況?

回答

3

第一個問題: 可能不是最好的方式,但我所做的就是,建立模型,訓練前,後啓動:

for v in tf.trainable_variables(): 
    if v.name == 'embedding_rnn_seq2seq/RNN/EmbeddingWrapper/embedding:0': 
    assign_op = v.assign(my_word2vec_matrix) 
    session.run(assign_op) # or `assign_op.op.run()` 

my_word2vec_matrix是形狀vocabularysize X嵌入尺寸和填充的矩陣在我預先計算的嵌入向量中。 如果你認爲你的嵌入真的很好,可以使用這個(或類似的東西)。否則隨着時間的推移,seq2seq-Model將提出自己的訓練嵌入。

第二個問題: 在seq2seq.py中有一個對model_with_buckets()的調用,您可以在python/ops/seq2seq.py中找到它。從那裏返回損失。

第三個問題: 在測試案例中,每個解碼器輸入是從時間步之前的解碼器輸出(即第一個解碼器輸入是特殊的GO符號,第二個解碼器輸入是第一個時間步的解碼器輸出,第三個解碼器輸入是第二個時間步的解碼器輸出,依此類推)

+0

好的,謝謝。那麼,我們在API中提供my_word2vec_matrix? encoder_cell(在embedding_attention_seq2seq中)是需要用tf.embedding_lookup替換的嵌入矩陣嗎? – user3480922

+0

您使用的embedding_rnn_seq2seq - 函數會自動執行此操作。順便說一句,您需要更正我的片段中的名稱,從embedding_attention_seq2seq到embedding_rnn_seq2seq – friesel

+0

「自動」我的意思是:embedding_rnn_seq2seq使用嵌入矩陣。我的assign_op將您的矩陣分配給模型中使用的嵌入矩陣 – friesel

相關問題