我正在尝试使用tensorflow编写简单的神经机器翻译代码。但是我对在张量流上嵌入的理解有些困惑:
tf.contrib.layers.embed_sequence(inputs, vocab_size=target_vocab_size,embed_dim=decoding_embedding_size)
之间的区别和
dec_embeddings = tf.Variable(tf.random_uniform([target_vocab_size, decoding_embedding_size]))
dec_embed_input = tf.nn.embedding_lookup(dec_embeddings, dec_input)
在这种情况下,我应该互相使用吗?
如果我理解正确,第一个问题是关于tf.contrib.layers.embed_sequence
和tf.nn.embedding_lookup
之间的区别。
根据官方文档(https://www.tensorflow.org/api_docs/python/tf/contrib/layers/embed_sequence),
典型的用例是重用编码器和解码器之间的嵌入。
我认为tf.contrib.layers.embed_sequence
是为seq2seq模型设计的。
我找到了以下帖子:
提到@ispirmustafa的地方:
embedding_lookup不支持无效的ID。
另外,在另一篇文章中:tf.contrib.layers.embed_sequence() is for what?
@ user1930402说:
- [通过使用tensorflow.contrib.layers.embed_sequence建立具有多个以特征为输入的门的神经网络模型时,您可以在保留深度的同时减少网络中的参数数量。例如,它消除了LSTM的每个门执行其自己的特征线性投影的需要。
- 它允许任意输入形状,这有助于实现简单灵活。
关于第二个问题,很抱歉,我没有使用TrainingHelper
并且无法回答您的问题。
我想您来自this seq2seq教程。即使这个问题开始变得老套了,我也会尝试为像我这样路过的人解答:
tf.contrib.layers.embed_sequence
,它实际上是使用 tf.nn.embedding_lookup
。因此,它只包装了它,并为您创建了嵌入矩阵(tf.Variable(tf.random_uniform([target_vocab_size, decoding_embedding_size]))
)。尽管这很方便且不那么冗长,但使用embed_sequence
似乎并没有直接的方式来访问嵌入。因此,如果需要,您必须使用相同的名称空间来查询用作嵌入矩阵的内部变量。我必须承认上面教程中的代码令人困惑。我什至怀疑他在编码器和解码器中使用了不同的嵌入。TrainingHelper
不需要embedding_lookup
,因为它仅将输入转发到解码器,GreedyEmbeddingHelper
确实将[èmbedding_lookup`作为第一个输入,] documentation中提到。 >