0

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

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

1 回答 1

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-symbol,第二个解码器输入是第一个时间步的解码器输出,第三个解码器输入是第二个时间步的解码器输出,依此类推)

于 2016-08-01T13:31:13.977 回答