我正在使用类似于 Kim 2014 的 CNN 实现文本分类器与 tensorflow 。 Tensorflow 提供了 tf.nn.embedding_lookup_sparse,它允许您提供单词 ID 作为稀疏张量。这很好,特别是对于启用可变长度序列而言。然而,该函数在查找之后需要一个“组合”步骤,例如“mean”或“sum”。这将其强制回到稠密张量空间。我不想做任何组合。我想将向量保留在稀疏表示中,这样我就可以在之后进行其他卷积。这在 TF 中可能吗?
编辑:我想避免在嵌入查找之前填充输入。这是因为 Tensorflow 的嵌入查找为 pad 值生成向量,而试图用零掩盖它是一个拼凑 (see here) .
最佳答案
我认为这个问题有两点令人困惑。首先,组合器操作发生在稀疏索引输入 sp_ids
的每行的嵌入 ID 集合上。因此,如果 sp_ids
的形状为 N x 1,那么您只需“组合”每行 sp_ids
一个嵌入向量,这将仅检索该嵌入向量(我认为你所说的是你想要的)。
其次,返回值是每行输入的嵌入向量。根据嵌入的定义以及 TensorFlow 嵌入操作的计算内容,嵌入向量本身就是一个稠密向量。所以这个返回结果总是稠密的,这就是你想要的。稀疏矩阵表示的效率非常低,因为无论是否发生任何“组合器”操作,矩阵确实都是稠密的(充满稠密的嵌入)。
您链接的研究论文似乎没有采用任何类型的特殊方法来导致稀疏嵌入向量的特殊情况,因此我在这里看不到期望或期望稀疏输出的原因。
也许我是错的,您能否提供更多关于为什么您期望嵌入向量本身是稀疏向量的详细信息?如果是这样,那将是一个非常不寻常的情况。
关于python - Tensorflow - 稀疏嵌入查找仍然稀疏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53197231/