张量和稀疏张量之间有什么区别?

时间:2017-12-05 20:29:48

标签: python tensorflow

我很难理解Tensorflow Tensors Sparse Tensors 的含义和用法。

根据文件

张量

  

Tensor是一种打字的多维数组。例如,您可以将一小批图像表示为具有维度[批次,高度,宽度,通道]的浮点数的4维数组。

稀疏张量

  

TensorFlow将稀疏张量表示为三个独立的密集张量:索引,值和形状。在Python中,三个张量被收集到SparseTensor类中以便于使用。如果您有单独的索引,值和形状张量,请在传递给下面的操作之前将它们包装在SparseTensor对象中。

我的理解是Tensors用于操作,输入和输出。而Sparse Tensor只是Tensor的另一种表现形式(密集?)。希望有人能够进一步解释它们之间的差异和用例。

2 个答案:

答案 0 :(得分:9)

差异涉及计算速度。如果大张量具有许多零,则通过迭代非零元素来执行计算会更快。因此,您应该将数据存储在SparseTensor中,并使用SparseTensors的特殊操作。

矩阵和稀疏矩阵的关系类似。稀疏矩阵在动态系统中很常见,数学家已经开发了许多特殊的操作方法。

答案 1 :(得分:0)

马修做得很好,但我想举一个例子,以一个例子来阐明稀疏张量。

如果张量具有很多零值,则可以将其称为稀疏。

让我们考虑稀疏的一维张量

[0, 7, 0, 0, 8, 0, 0, 0, 0]

相同张量的稀疏表示将仅关注非零值

values = [7,8]

我们还必须记住它们的索引在哪里出现

indices = [1,5]

对于此一维示例,一维索引形式可以使用某些方法,但是一般而言索引具有多个维度,因此表示这样的索引将更加一致(并且可以在任何地方使用):

indices = [[1], [5]]

对于值和索引,我们还没有足够的信息。有多少个零?我们表示张量的密集形状。

 dense_shape = [9]

这三个东西,值,索引和密实形状,是张量的稀疏表示

在tensorflow 2.0中,它可以实现为

x = tf.SparseTensor(values=[7,8],indices=[[1],[5]],dense_shape=[9])
x
#o/p: <tensorflow.python.framework.sparse_tensor.SparseTensor at 0x7ff04a58c4a8>

print(x.values)
print(x.dense_shape)
print(x.indices)
#o/p: 
tf.Tensor([7 8], shape=(2,), dtype=int32)
tf.Tensor([9], shape=(1,), dtype=int64)
tf.Tensor(
[[1]
 [5]], shape=(2, 1), dtype=int64)