来自官网
tf.nn.embedding_lookup_sparse(
params,
sp_ids,
sp_weights,
partition_strategy='mod',
name=None,
combiner=None,
max_norm=None
)
-
params
embedding使用的lookup table. -
sp_ids
查找lookup table的SparseTensor. -
combiner
通过什么运算把一行的数据结合起来mean
,sum
等. - 其它没用到过
例子
首先定义embedding的矩阵
import numpy as np
import tensorflow as tf
### embedding matrix
example = np.arange(24).reshape(6, 4).astype(np.float32)
embedding = tf.Variable(example)
其实这个矩阵就是
#------------------------------------------------------#
array([[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.],
[12., 13., 14., 15.],
[16., 17., 18., 19.],
[20., 21., 22., 23.]], dtype=float32)
#------------------------------------------------------#
接下来使用tf.SparseTensor
来定义一个稀疏矩阵
### embedding lookup SparseTensor
idx = tf.SparseTensor(indices=[[0, 0], [0, 1], [1, 1], [1, 2], [2, 0]],
values=[0, 1, 2, 3, 0], dense_shape=[3, 3])
# 这个稀疏矩阵写成普通形式这样
#---------------------------------------------------------------------#
array([[0, 1, None],
[None, 2, 3],
[0, None, None]]) # 为了与0元素相区别,没有填充的部分写成了None
#---------------------------------------------------------------------#
使用查找表,打印出结果
embed = tf.nn.embedding_lookup_sparse(embedding, idx, None, combiner='sum')
sess = tf.Session()
sess.run(tf.global_variables_initializer())
print(sess.run(embed))
#----------------结果----------------------#
[[ 4. 6. 8. 10.]
[20. 22. 24. 26.]
[ 0. 1. 2. 3.]]
#-------------------------------------------#
现在分析一下结果,结果的shape
=(idx.shape[0], embedding.shape[1])
,其中结果的第一行等于“embeding的第一行加上embedding的第二行,也就是idx的第一行非None的元素的value,对应了embedding的行数,然后这些行相加“;结果第二行为”embedding第3行和第四行相加“;结果第三行也同理。
网友评论