12

我正在尝试学习如何使用 TensorFlow 构建用于语音识别的 RNN。作为开始,我想尝试一些示例模型放在 TensorFlow 页面TF-RNN

根据建议,我花了一些时间通过处理 word2vec 模型代码的基本版本来了解如何将单词 ID 嵌入到密集表示(向量表示)中。我对实际操作有所了解,直到我在TF-RNNtf.nn.embedding_lookup中实际遇到与二维数组一起使用的相同函数,但它不再有意义。 ptb_word_lm.py

我虽然tf.nn.embedding_lookup做了:

给定一个 2-d arrayparams和一个 1-d array ids,函数tf.nn.embedding_lookup从参数中获取行,对应于 给出的索引ids,它与它返回的输出的维度保持一致。

我感到困惑的是:

当尝试使用相同的参数和 2-d arrayids时,tf.nn.embedding_lookup返回 3-d array,而不是 2-d,我不明白为什么。

我查阅了Embedding Lookup的手册,但我仍然很难理解分区的工作原理以及返回的结果。我最近尝试了一些简单的例子,tf.nn.embedding_lookup它似乎每次都返回不同的值。这种行为是由于分区中涉及的随机性造成的吗?

请帮助我了解如何tf.nn.embedding_lookup工作,为什么在两者中都使用它们word2vec_basic.pyptb_word_lm.py即,甚至使用它们的目的是什么?

4

1 回答 1

17

tf.nn.embedding_lookup 已经有一个关于这里做什么的答案。


当尝试使用相同的参数和二维数组 ID 时,tf.nn.embedding_lookup 返回 3-d 数组,而不是 2-d,我不明白为什么。

当您有一个 ids 的一维列表时[0, 1],该函数将返回一个嵌入列表,[embedding_0, embedding_1]其中embedding_0是一个 shape 数组embedding_size。例如,id 列表可以是一组单词。

现在,您有一个id矩阵或一个 id 列表列表。例如,您现在有一批句子,即一批单词列表,即单词列表列表。

如果您的句子列表是:([[0, 1], [0, 3]]句子 1 是[0, 1],句子 2 是[0, 3]),该函数将计算嵌入矩阵,其形状[2, 2, embedding_size]如下:

[[embedding_0, embedding_1],
 [embedding_0, embedding_3]]

关于partition_strategy论点,您不必为此烦恼。基本上,如果您在计算上有限制,它允许您提供嵌入矩阵列表params而不是 1 个矩阵。

因此,您可以将形状嵌入矩阵拆分为[1000, embedding_size]十个形状矩阵,[100, embedding_size]并将此变量列表作为params. 该参数partition_strategy处理 10 个矩阵中的词汇表(1000 个单词)的分布。

于 2016-06-20T22:45:34.893 回答