我是tensorflow的新手。我正在尝试了解word2vec_basic脚本。
在开始时,它定义了输入和输出。
train_inputs = tf.placeholder(tf.int32, shape=[batch_size])
train_labels = tf.placeholder(tf.int32, shape=[batch_size, 1])
如果我正确理解Train_inputs的形状-
[batch_size]
是整数数组,则数组的长度为batch_size
。那么train_labels
的形状是[batch_size, 1]
,它是具有单行的矩阵。正确?如果是,我不明白为什么会这样,以及什么应该存储在这些占位符中。根据理论,label
是一个int,而input
是上下文的滑动窗口的数组,那么为什么batch_size
出现在这里?似乎我错过了理论中的一些基本知识。我希望得到一个解释。
最佳答案
我最近刚调试了word2vec_basic.py,并以一个简单的数据集示例为例:“狗看见猫,猫追着猫,猫爬了树”,dictionary
是{'the': 0, 'cat': 1, 'dog': 2, 'a': 3, 'saw': 4, 'chased': 5, 'climbed': 6, 'tree': 7}
,reverse_dictionary
是{0: 'the', 1: 'cat', 2: 'dog', 3: 'a', 4: 'saw', 5: 'chased', 6: 'climbed', 7: 'tree'}
。
当batch_size = 8,skip_window = 1,embedding_size = 1和num_skips = 2时,调用generate_batch
返回:batch: [2 2 4 4 3 3 1 1]labels: [[0] [4] [2] [3] [4] [1] [0] [3]]
翻译成单词,它们是:batch: [dog, dog, saw, saw, a, a, cat, cat]labels: [[the], [saw], [dog], [a], [saw], [cat], [the], [a]]
对于数据集中的前三个单词“狗锯”,因为skip_window为1,则预期的(目标,上下文)对应该是(狗,锯齿)和(狗,锯锯齿)-请参见“跳过语法模型”如果需要,请在https://www.tensorflow.org/tutorials/word2vec中获取更多详细信息。
至于为什么在[batch_size, 1]
中使用1的原因,在https://www.tensorflow.org/api_docs/python/tf/nn/nce_loss处的nce_loss
文档中说:“标签:int64类型的Tensor,形状为[batch_size,num_true]。目标类。”和“ num_true:一个整数。每个训练示例的目标类的数量。” (num_true的默认值为1)
并在代码中定义了nce_loss
:
loss = tf.reduce_mean(
tf.nn.nce_loss(weights=nce_weights,
biases=nce_biases,
labels=train_labels,
inputs=embed,
num_sampled=num_sampled,
num_classes=vocabulary_size))
因此,现在应该很容易看到
train_inputs
和train_labels
的形状是有意义的。关于python - tensorflow word2vec基本输入输出占位符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42663047/