如何在Tensorflow中运行自定义seq2seq学习(使用预先计算的字嵌入)编码器解码器?

时间:2016-07-31 18:53:57

标签: python tensorflow deep-learning lstm language-model

我需要在Tensorflow中运行编码器 - 解码器模型。我看到使用可用的API basic_rnn_seq2seq(encoder_input_data, decoder_input_data, lstm_cell)等,可以创建编码器 - 解码器系统。

  1. 我们如何在这样的模型中输入word2vec这样的嵌入?我是 意识到我们可以根据API进行嵌入查找 encoder_input_data是尺寸为batch_size x的2D Tensor列表 input_size。如何使用此设置中的相应单词嵌入来表示每个单词?甚至embedding_rnn_seq2seq内部提取嵌入。如何将预先计算的单词嵌入作为输入?
  2. 我们如何通过API获得成本/困惑?
  3. 在测试实例的情况下,我们可能不知道相应的解码器输入。如何处理这种情况?

1 个答案:

答案 0 :(得分: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是一个形状词汇表x嵌入大小的矩阵,填写在我的预先计算的嵌入向量中。 如果您认为嵌入非常好,请使用此(或类似的东西)。否则,随着时间的推移,seq2seq-Model将提供自己训练有素的嵌入。

第二个问题: 在seq2seq.py中有一个对model_with_buckets()的调用,您可以在python / ops / seq2seq.py中找到它。从那里返回损失。

第三个问题: 在测试用例中,每个解码器输入是从时间步之前的解码器输出(即第一解码器输入是特殊GO符号,第二解码器输入是第一时间步的解码器输出,第三解码器输入是解码器输出第二个时间步,等等)