【发布时间】:2017-05-30 15:01:04
【问题描述】:
我关注 this tutorial 是为了了解 NLP 中的 CNN。尽管我面前有代码,但仍有一些我不明白的事情。我希望有人可以在这里澄清一些事情。
第一个相当小的事情是TextCNN 对象的sequence_length参数。在 github 上的示例中,这只是 56,我认为这是训练数据中所有句子的最大长度。这意味着self.input_x 是一个 56 维向量,它将仅包含每个单词的句子字典中的索引。
此列表进入tf.nn.embedding_lookup(W, self.intput_x),它将返回一个矩阵,该矩阵由self.input_x 给出的这些单词的单词嵌入组成。根据this answer,此操作类似于使用 numpy 进行索引:
matrix = np.random.random([1024, 64])
ids = np.array([0, 5, 17, 33])
print matrix[ids]
但这里的问题是self.input_x 大部分时间看起来像[1 3 44 25 64 0 0 0 0 0 0 0 .. 0 0]。如果我假设 tf.nn.embedding_lookup 忽略值 0,我是否正确?
我不明白的另一件事是tf.nn.embedding_lookup 是如何在这里工作的:
# Embedding layer
with tf.device('/cpu:0'), tf.name_scope("embedding"):
W = tf.Variable(
tf.random_uniform([vocab_size, embedding_size], -1.0, 1.0),
name="W")
self.embedded_chars = tf.nn.embedding_lookup(W, self.input_x)
self.embedded_chars_expanded = tf.expand_dims(self.embedded_chars, -1)
我假设,self.embedded_chars 是一个矩阵,它是 CNN 的 实际 输入,其中每一行代表 一个 词的词嵌入。但是tf.nn.embedding_lookup 怎么知道self.input_x 给出的那些索引呢?
我在这里不明白的最后一件事是
W是我们在训练期间学习的嵌入矩阵。我们使用随机均匀分布对其进行初始化。tf.nn.embedding_lookup创建实际的嵌入操作。嵌入操作的结果是一个形状为[None, sequence_length, embedding_size]的3维张量。
这是否意味着我们实际上在在这里学习词嵌入?教程开头说:
我们不会将预训练的 word2vec 向量用于我们的词嵌入。相反,我们从头开始学习嵌入。
但我没有看到实际发生这种情况的代码行。 code of the embedding layer 看起来不像是在训练或学习任何东西 - 那么它发生在哪里?
【问题讨论】:
标签: tensorflow nlp conv-neural-network