我正在尝试使用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)
在这种情况下,我应该一个人使用另一个吗?
答案 0 :(得分:2)
我想您来自this seq2seq教程。即使这个问题开始变得老套了,我也会尝试为像我这样路过的人解答:
exists
后面的source code,实际上是使用 select User.*, Doc.LastDoc
FROM de_Users AS Us
LEFT JOIN
(
SELECT UserID,MAX(DataFi) AS LastDoc
FROM de_doc
GROUP BY UserID
) as Doc ON Doc.UserID = Us.ID_U
AND Doc.LastDoc = Us.DataFi -- this was missing
ORDER BY Us.Name ASC, Doc.LastDoc DESC;
。因此,它只是包装好了,并为您创建了嵌入矩阵(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
作为第一个输入,如documentation。答案 1 :(得分:1)
如果我对您的理解正确,那么第一个问题是关于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
并且无法回答您的问题。