tf.sparse_to_dense

  函数原型如下:

tf.sparse_to_dense(sparse_indices, output_shape, sparse_values, default_value, name=None)

这个函数的作用是将一个稀疏表示转换成一个密集张量。具体将稀疏张量sparse转换成密集张量dense的步骤如下:

# If sparse_indices is scalar
dense[i] = (i == sparse_indices ? sparse_values : default_value)
# If sparse_indices is a vector, then for each i
dense[sparse_indices[i]] = sparse_values[i]
# If sparse_indices is an n by d matrix, then for each i in [0, n)
dense[sparse_indices[i][0], ..., sparse_indices[i][d-1]] = sparse_values[i]

默认情况下,dense中的填充值default_value都是0,除非该值被设置成一个标量。

  • sparse_indices是稀疏矩阵中那些个别元素对应的索引值,有三种情况:
  1. 如果sparse_indices是个数,那么它只能指定一维矩阵的某一个元素。
  2. 如果sparse_indices是个向量,那么它可以指定一维矩阵的多个元素。
  3. 如果sparse_indices是个矩阵,那么它可以指定二维矩阵的多个元素。
  • output_shape是输出的稀疏矩阵的shape
  • sparse_values是个别元素的值,分为两种情况:
  1. 如果sparse_values是个数,则所有索引指定的位置都用这个数。
  2. 如果sparse_values是个向量,则输出矩阵的某一行向量里某一行对应的数(所以这里向量的长度应该和输出矩阵的行数对应,不然报错)。
  • default_value是未指定元素的默认值,一般如果是稀疏矩阵,就是0了。
import tensorflow as tf

BATCH_SIZE = 5
# 真实标签,shape为[5, 1]
label = tf.expand_dims(tf.constant([1, 3, 5, 7, 9]), 1)
# 真实标签的索引,shape为[5, 1]
index = tf.expand_dims(tf.range(0, BATCH_SIZE), 1)
# 将标签和索引tensor在第二个维度上连接起来,新的concated的shape为[5, 2]
concated = tf.concat([index, label], 1)
# onehot_labels的shape为[5, 10]
onehot_labels = tf.sparse_to_dense(concated, [BATCH_SIZE, 10], 1.0, 0.0)

with tf.Session() as sess:
    print(sess.run(concated))
    print("----------------")
    onehot1 = sess.run(onehot_labels)
    print(onehot1)

执行结果:

[[0 1]
 [1 3]
 [2 5]
 [3 7]
 [4 9]]
----------------
[[0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]]

  如果output_shape是一个行向量:

import tensorflow as tf

predicted_class = [1, 3, 5, 7, 9]
nb_classes = 10
one_hot = tf.sparse_to_dense(predicted_class, [nb_classes], 1.0)

with tf.Session() as sess:
    onehot1 = sess.run(one_hot)
    print(onehot1)  # 输出“[0. 1. 0. 1. 0. 1. 0. 1. 0. 1.]”
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值