理解word2vec(TensorFlow)中的输入和标签

我正在努力正确理解TensorFlow中“单词的向量表示”教程中的batch_inputbatch_labels

例如,我的数据

 1 1 1 1 1 1 1 1 5 251 371 371 1685 ...

… 以如下方式开始

skip_window = 2 # 左右各考虑多少个单词。num_skips = 1 # 一个输入生成一个标签的次数。

然后生成的输入数组是:

bach_input = 1 1 1 1 1 1 5 251 371 ....  

这很合理,从窗口大小2之后开始,然后连续。标签是:

batch_labels = 1 1 1 1 1 1 251 1 1685 371 589 ...

我对这些标签的理解不是很清楚。每个输入应该有4个标签,对吗(窗口大小2,每边各2个)。但是batch_label变量的长度是相同的。

根据TensorFlow教程:

skip-gram模型接受两个输入。一个是代表源上下文单词的整数批次,另一个是目标单词的批次。

根据教程,我声明了这两个变量如下:

  batch = np.ndarray(shape=(batch_size), dtype=np.int32)  labels = np.ndarray(shape=(batch_size, 1), dtype=np.int32)

我应该如何解释batch_labels


回答:

每个输入应该有4个标签,对吗(窗口大小2,每边各2个)。但是batch_label变量的长度是相同的。

关键设置是num_skips = 1。这个值定义了每个单词生成的(input, label)元组的数量。请看下面不同num_skips的示例(我的data序列似乎与你的不同,对此我感到抱歉)。

示例#1 – num_skips=4

batch, labels = generate_batch(batch_size=8, num_skips=4, skip_window=2)

它为每个单词生成4个标签,即使用整个上下文;由于batch_size=8,在这一批次中只处理了2个单词(126),其余的将进入下一批次:

data = [5239, 3084, 12, 6, 195, 2, 3137, 46, 59, 156, 128, 742, 477, 10572, ...]batch = [12 12 12 12  6  6  6  6]labels = [[6 3084 5239 195 195 3084 12 2]]

示例#2 – num_skips=2

batch, labels = generate_batch(batch_size=8, num_skips=2, skip_window=2)

在这里,你会期望每个单词在batch序列中出现两次;2个标签是从4个可能的单词中随机抽取的:

data = [5239, 3084, 12, 6, 195, 2, 3137, 46, 59, 156, 128, 742, 477, 10572, ...]batch = [ 12  12   6   6 195 195   2   2]labels = [[ 195 3084   12  195 3137   12   46  195]]

示例#3 – num_skips=1

batch, labels = generate_batch(batch_size=8, num_skips=1, skip_window=2)

最后,这个设置与你的相同,为每个单词生成一个标签;每个标签是从4个单词的上下文中随机抽取的:

data = [5239, 3084, 12, 6, 195, 2, 3137, 46, 59, 156, 128, 742, 477, 10572, ...]batch = [  12    6  195    2 3137   46   59  156]labels = [[  6  12  12 195  59 156  46  46]]

我应该如何解释batch_labels

每个标签是待从上下文中预测的中心单词。但生成的数据可能不会包含所有的(context, center)元组,这取决于生成器的设置。

还要注意的是,train_labels张量是一维的。Skip-Gram模型训练的是从给定的中心单词预测任何上下文单词,而不是一次预测所有4个上下文单词。这解释了为什么所有训练对(12, 6)(12, 3084)(12, 5239)(12, 195)都是有效的。

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注