首页 文章

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

提问于
浏览
0

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

  • 如何在这样的模型中输入word2vec这样的嵌入?我知道我们可以嵌入查找但是根据API encoder_input_data 是2D Tensor的大小batch_size x input_size的列表 . 如何使用此设置中的相应单词嵌入来表示每个单词?甚至 embedding_rnn_seq2seq 内部提取嵌入 . 如何将预先计算的单词嵌入作为输入?

  • 我们如何通过API获得成本/困惑?

  • 如果是测试实例,我们可能不知道相应的解码器输入 . 如何处理这种情况?

1 回答

  • 3

    第一个问题:可能不是最好的方法,但在培训开始之前,我在 Build 模型之后所做的是:

    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符号,第二个解码器输入是第一个时间步的解码器输出,第三个解码器输入是解码器输出第二个时间步,等等)

相关问题