我现在正在浏览谷歌的TensorFlow cookbook
这是skip-gram模型的TensorFlow实现。
在第272行,作者决定将相似度矩阵(-sim[j, :])负相乘。我有点困惑,为什么我们需要在跳过模型中负相乘相似度矩阵。有什么想法吗?
for j in range(len(valid_words)):
valid_word = word_dictionary_rev[valid_examples[j]]
top_k = 5 # number of nearest neighbors
**nearest = (-sim[j, :]).argsort()[1:top_k+1]**
log_str = "Nearest to {}:".format(valid_word)
for k in range(top_k):
close_word = word_dictionary_rev[nearest[k]]
score = sim[j,nearest[k]]
log_str = "%s %s," % (log_str, close_word)
print(log_str)发布于 2018-02-10 17:03:12
让我们一步一步地来看这个例子:
首先,这里有一个similarity张量。它被定义为嵌入向量之间成对余弦相似度的矩阵:词之间的余弦相似度norm = tf.sqrt(tf.reduce_sum(tf.square( embeddings ),1,keep_dims=True)) normalized_embeddings =embeddings/ norm valid_embeddings = tf.nn.embedding_lookup(normalized_embeddings,valid_dataset) similarity= tf.matmul(valid_embeddings,normalized_embeddings,transpose_b=True)矩阵是为所有验证词和所有字典词计算的,并包含[-1,1]之间的数字。在此示例中,单词大小为10000,并且验证集由5个单词组成,因此数值矩阵的形状是(5, 10000).
similarity数组sim:sim =sess.run(相似度,feed_dict=feed_dict)
因此,sim.shape = (5, 10000)也是如此。
最近的= (-simj,:).argsort()1:top_k+1
..。计算与当前单词j最接近的单词索引top_k。看一看numpy.argsort方法。求反只是对in descending order进行排序的一种愚蠢的方式。如果没有减号,结果将是字典中top_k最远的单词,这并不表示word2vec已经学到了任何东西。
还要注意,范围是[1:top_k+1],而不是[:top_k],因为第0个字是当前验证字本身。印刷最接近“爱”的词是没有意义的.“爱”
这一行的结果是一个类似[ 73 1684 850 1912 326]的数组,它对应于单词sex, fine, youd, trying, execution.
https://stackoverflow.com/questions/48717029
复制相似问题