【问题标题】:How to use tf.nn.embedding_lookup_sparse in TensorFlow?如何在 TensorFlow 中使用 tf.nn.embedding_lookup_sparse?
【发布时间】:2017-01-05 13:31:42
【问题描述】:

我们已经尝试使用tf.nn.embedding_lookup 并且它有效。但它需要密集的输入数据,现在我们需要tf.nn.embedding_lookup_sparse 用于稀疏输入。

我编写了以下代码,但出现了一些错误。

import tensorflow as tf
import numpy as np

example1 = tf.SparseTensor(indices=[[4], [7]], values=[1, 1], shape=[10])
example2 = tf.SparseTensor(indices=[[3], [6], [9]], values=[1, 1, 1], shape=[10])

vocabulary_size = 10
embedding_size = 1
var = np.array([0.0, 1.0, 4.0, 9.0, 16.0, 25.0, 36.0, 49.0, 64.0, 81.0])
#embeddings = tf.Variable(tf.ones([vocabulary_size, embedding_size]))
embeddings = tf.Variable(var)

embed = tf.nn.embedding_lookup_sparse(embeddings, example2, None)

with tf.Session() as sess:
    sess.run(tf.initialize_all_variables())

    print(sess.run(embed))

错误日志如下所示。

现在我不知道如何正确修复和使用此方法。任何意见都可以得到赞赏。

在深入了解safe_embedding_lookup_sparse 的单元测试之后,我更困惑为什么如果给出稀疏权重我会得到这个结果,尤其是为什么我们得到类似embedding_weights[0][3] 的东西,而上面的代码中没有出现3 .

【问题讨论】:

  • 请告诉我我的回答是否解决了您的问题:)
  • 谢谢@rvinas。在阅读safe_embedding_lookup_sparse 的单元测试后,我还没有弄清楚。我已经更新了问题,您愿意为我们解释一下代码吗?
  • 拜托,你能提供原始代码吗?

标签: python tensorflow sparse-matrix embedding


【解决方案1】:

tf.nn.embedding_lookup_sparse() 使用 Segmentation 来组合嵌入,这要求 SparseTensor 中的索引从 0 开始并增加 1。这就是您收到此错误的原因。

您的稀疏张量不需要布尔值,而是只需要保存您想从嵌入中检索的每一行的索引。这是您调整后的代码:

import tensorflow as tf
import numpy as np

example = tf.SparseTensor(indices=[[0], [1], [2]], values=[3, 6, 9], dense_shape=[3])

vocabulary_size = 10
embedding_size = 1
var = np.array([0.0, 1.0, 4.0, 9.0, 16.0, 25.0, 36.0, 49.0, 64.0, 81.0])
embeddings = tf.Variable(var)

embed = tf.nn.embedding_lookup_sparse(embeddings, example, None)

with tf.Session() as sess:
    sess.run(tf.initialize_all_variables())
    print(sess.run(embed)) # prints [  9.  36.  81.]

此外,您可以使用来自tf.SparseTensor() 的索引来使用允许的tf.nn.embedding_lookup_sparse() 组合器之一来组合词嵌入:

  • “sum”计算每行嵌入结果的加权和。
  • “均值”是加权总和除以总权重。
  • “sqrtn”是加权和除以权重平方和的平方根。

例如:

example = tf.SparseTensor(indices=[[0], [0]], values=[1, 2], dense_shape=[2])
...
embed = tf.nn.embedding_lookup_sparse(embeddings, example, None, combiner='sum')
...
print(sess.run(embed)) # prints [ 5.]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-26
    • 2019-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 2019-09-09
    相关资源
    最近更新 更多