我正在尝试使用TensorFlow学习如何为语音识别构建RNN。首先,我想尝试一下TensorFlow页面TF-RNN上提供的一些示例模型
根据建议,通过完成word2vec模型代码的基本版本,我花了一些时间来了解如何将字ID嵌入到密集表示(Vector Representation)中。我理解tf.nn.embedding_lookup
实际上做了什么,直到我实际遇到与TF-RNN ptb_word_lm.py
中的二维数组一起使用的相同函数,直到它再也没有意义了。
tf.nn.embedding_lookup
做了什么:给定2-d数组params
和1-d数组ids
,函数tf.nn.embedding_lookup
从params中获取行,对应于ids
中给出的索引,它与输出的维度保持一致。
尝试使用相同的参数和2-d数组ids
时,tf.nn.embedding_lookup
会返回3-d数组,而不是2-d,我不明白为什么。
我查阅了Embedding Lookup的手册,但我仍然觉得很难理解分区是如何工作的,以及返回的结果。我最近用tf.nn.embedding_lookup
尝试了一些简单的例子,看起来它每次都返回不同的值。这种行为是否归因于分区涉及的随机性?
请帮助我了解tf.nn.embedding_lookup
的工作原理,以及word2vec_basic.py
和ptb_word_lm.py
中使用的原因,即使用它们的目的是什么?
答案 0 :(得分:15)
关于tf.nn.embedding_lookup
here的内容已有答案。
当尝试使用相同的参数和2-d数组id时,tf.nn.embedding_lookup返回3-d数组,而不是2-d,我不明白为什么。
如果您有一个ID {1}}的一维列表,该函数将返回一个嵌入列表[0, 1]
,其中[embedding_0, embedding_1]
是一个形状embedding_0
的数组。例如,id列表可以是一批单词。
现在,您有一个矩阵的ids或一系列ID列表。例如,您现在有一批句子,即一批单词列表,即单词列表列表。
如果您的句子列表为:embedding_size
(句子1为[[0, 1], [0, 3]]
,句子2为[0, 1]
),则该函数将计算嵌入矩阵,其形状为{ {1}}并且看起来像:
[0, 3]
关于[2, 2, embedding_size]
论点,你不必为此烦恼。基本上,如果计算有限,它允许您将嵌入矩阵列表设为[[embedding_0, embedding_1],
[embedding_0, embedding_3]]
而不是1个矩阵。
因此,您可以将形状partition_strategy
的嵌入矩阵拆分为十个形状params
的矩阵,并将此变量列表作为[1000, embedding_size]
传递。参数[100, embedding_size]
处理10个矩阵中词汇表(1000个单词)的分布。