embedding_lookup,embedding_lookup_sparse,safe_embedding_lookup_sparse的使用

1. 总结

2. embedding_lookup

embedding_lookup有两个必选参数:params和ids,即返回ids指向的embedding。
embedding_lookup是三个lookup中最简单的一个,直接举例说明。

# 创建一个长度为4,维度为5的embedding矩阵
# array([[ 0,  1,  2,  3,  4],
#        [ 5,  6,  7,  8,  9],
#        [10, 11, 12, 13, 14],
#        [15, 16, 17, 18, 19]])
EmbMat = tf.constant(np.arange(20).reshape(4,5))
ids = [1,3] # 取出Emb中索引为1和3的embedding
emb = tf.nn.embedding_lookup(EmbMat, ids)
with tf.Session() as sess:
    emb_val = sess.run(emb)
# emb_val
# array([[ 5,  6,  7,  8,  9],
#        [15, 16, 17, 18, 19]])

3. embedding_lookup_sparse

3.1 tf.SparseTensor

构造SparseTensor需要传入三个参数:

  • dense_shape:SparseTensor的矩阵维度
  • indices:非0值所在的位置
  • values:indices中所表示的非0值位置的值

如:

SparseTensor(indices=[[0, 0], [1, 2]], values=[1, 2], dense_shape=[3, 4])

表示的稀疏矩阵为:

[[1, 0, 0, 0]
 [0, 0, 2, 0]
 [0, 0, 0, 0]]

3.2 embedding_lookup_sparse使用

# 创建一个长度为4,维度为5的embedding矩阵
# array([[ 0.,  1.,  2.,  3.,  4.],
#        [ 5.,  6.,  7.,  8.,  9.],
#        [10., 11., 12., 13., 14.],
#        [15., 16., 17., 18., 19.]])
EmbMat = tf.constant(np.arange(20).reshape(4,5).astype('f'))
# 创建SparseTensor
st = tf.SparseTensor(dense_shape=[3, 4],
                     indices=[[0, 1],[0, 2],
                              [1, 0],[1, 2],
                              [2, 3]],
                     values=[1,2,0,2,3])
# 根据稀疏向量SparseTensor,按照每一行取出embedding,并聚合(默认为mean)
emb = tf.nn.embedding_lookup_sparse(EmbMat, st, sp_weights=None)
with tf.Session() as sess:
    emb_val = sess.run(emb)
# emb_val
# array([[ 7.5,  8.5,  9.5, 10.5, 11.5],
#        [ 5. ,  6. ,  7. ,  8. ,  9. ],
#        [15. , 16. , 17. , 18. , 19. ]], dtype=float32)

3.3 稠密矩阵和稀疏矩阵之间的相互转换

此外,TF还提供了稀疏矩阵转换为稠密矩阵的函数:

3.3.1 稀疏矩阵转稠密矩阵

dt = tf.sparse_tensor_to_dense(st)
with tf.Session() as sess:
    val = sess.run(dt)

3.3.1 稠密矩阵转稀疏矩阵

def dense2sparse(dense):
    """
    稠密矩阵转稀疏矩阵
    tf.sparse_tensor_to_dense逆向操作
    dense: 稠密矩阵
    """
    where = tf.not_equal(dense, 0)
    indices = tf.where(where)
    values = tf.gather_nd(dense, indices)
    return tf.SparseTensor(indices, values, dense.shape)

4. safe_embedding_lookup_sparse

与embedding_lookup_sparse功能相同,针对有效地IDs。

tf.nn.embedding_lookup是一个用于选取张量中索引对应元素的函数。它的用法是tf.nn.embedding_lookup(tensor, id),其中tensor是输入张量,id是要查找的索引。根据id在tensor中找到对应的元素并返回。 举个例子,假设我们有一个嵌入矩阵embedding和一个输入id列表input_ids。我们可以使用tf.nn.embedding_lookup(embedding, input_ids)来找到embedding中与input_ids中的id对应的向量。如果input_ids=[1, 2, 3],则函数会返回embedding中下标为1, 2, 3的向量组成的矩阵。 需要注意的是,tf.nn.embedding_lookup不仅仅是简单地查表,查到的向量是可以训练的,也就是说它是一种全连接层,训练参数的个数是类别数乘以嵌入向量的大小。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [tf.nn.embedding_lookup()函数](https://blog.csdn.net/yql_617540298/article/details/88394120)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [tf.nn.embedding_lookup()的用法](https://blog.csdn.net/yangfengling1023/article/details/82910951)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值