尝试使用Tensorflow理解CNNs for NLP教程

尝试使用Tensorflow理解CNNs for NLP教程,tensorflow,nlp,conv-neural-network,Tensorflow,Nlp,Conv Neural Network,我以下是为了了解NLP中的CNN。尽管前面有代码,但有一些事情我还是不明白。我希望有人能澄清一些事情 第一件非常次要的事情是TextCNN对象的sequence\u length参数。在github上的示例中,这只是56,我认为这是训练数据中所有句子的最大长度。这意味着,self.input_x是一个56维向量,它只包含每个单词的句子字典索引 该列表进入tf.nn.embedding\u查找(W,self.intput\u x),它将返回一个由self.input\u x给出的那些单词的单词嵌

我以下是为了了解NLP中的CNN。尽管前面有代码,但有一些事情我还是不明白。我希望有人能澄清一些事情


第一件非常次要的事情是
TextCNN
对象的
sequence\u length
参数。在github上的示例中,这只是
56
,我认为这是训练数据中所有句子的最大长度。这意味着,
self.input_x
是一个56维向量,它只包含每个单词的句子字典索引

该列表进入
tf.nn.embedding\u查找(W,self.intput\u x)
,它将返回一个由
self.input\u x
给出的那些单词的单词嵌入组成的矩阵。根据以下说明,此操作类似于使用numpy索引:

matrix=np.random.random([1024,64])
ids=np.array([0,5,17,33])
打印矩阵[ids]
但是这里的问题是,
self.input\u x
大多数时候看起来像
[1 3 44 25 64 0 0 0 0 0 0 0..0 0]
。那么,如果我假设
tf.nn.embedded\u lookup
忽略值0,那么我是否正确


另一件我不明白的事情是
tf.nn.embedded\u lookup
在这里是如何工作的:

#嵌入层
对于tf.device('/cpu:0'),tf.name_作用域(“嵌入”):
W=tf.变量(
tf.随机均匀([声音大小,嵌入大小],-1.0,1.0),
name=“W”)
self.embedded_chars=tf.nn.embedded_查找(W,self.input_x)
self.embedded\u chars\u expanded=tf.expand\u dims(self.embedded\u chars,-1)
我假设,taht
self.embedded_chars
是矩阵,它是CNN的实际输入,其中每行表示一个单词的单词嵌入。但是
tf.nn.embedded\u lookup
如何知道那些由
self.input\u x
给出的索引呢


我不明白的最后一件事是

W
是我们在培训过程中学习的嵌入矩阵。我们使用随机均匀分布初始化它
tf.nn.embedding\u lookup
创建实际的嵌入操作。嵌入操作的结果是形状
[无,序列长度,嵌入大小]
的三维张量

这是否意味着我们实际上正在学习嵌入这个词?本教程在开头说明:

我们不会将预先训练好的word2vec向量用于单词嵌入。相反,我们从零开始学习嵌入

但我看不到有哪一行代码实际发生了这种情况。问题1的答案(如果我假设tf.nn.embedding\u查找忽略了值0,那么我是否正确?)

输入向量中的0是词汇表中第0个符号的索引,即PAD符号。我认为在执行查找时不会忽略它。将返回嵌入矩阵的第0行

问题2的答案(但是tf.nn.embedding\u lookup如何知道self.input\u x给出的索引?)

嵌入矩阵的大小为[V*E],其中是词汇表的大小,E是嵌入向量的维数。矩阵的第0行是词汇表的第0个元素的嵌入向量,矩阵的第1行是词汇表的第一个元素的嵌入向量。 从输入向量x,我们得到词汇表中的单词索引,用于索引嵌入矩阵

问题3的答案(这是否意味着我们实际上正在学习嵌入这个词?)

是的,我们实际上在学习嵌入矩阵。 在嵌入层中,行
W=tf.Variable(tf.random\u uniform([vocab\u size,embedding\u size],-1.0,1.0),name=“W”)
W是嵌入矩阵,默认情况下,在tensorflow
trainable=TRUE
中为变量。因此,W也将是一个学习参数。要使用预先训练的模型,请设置
trainable=False

有关代码的详细解释,请访问博客: