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

25

我有困难理解Tensorflow中张量和稀疏张量的含义和用法。

根据文档

张量

张量是一种类型化的多维数组。例如,您可以将一批图像表示为浮点数的4-D数组,其尺寸为[batch, height, width, channels]。

稀疏张量

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

我的理解是张量用于操作、输入和输出。而稀疏张量只是张量的另一种表示(密集?)。希望有人可以进一步解释它们的差异和使用案例。

2个回答

37

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

如果一个张量有很多值为零,那么它可以被称为稀疏。

让我们考虑一个稀疏的1-D张量。

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

同一张量的稀疏表示只关注非零值。

values = [7,8]

我们还必须记住这些值出现的索引位置

indices = [1,4]

一维索引形式在某些方法中可用于这个一维示例,但通常情况下,索引具有多个维度,因此更一致的表示索引的方式是像这样:

indices = [[1], [4]]

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

 dense_shape = [9]

这三个要素,值、索引和密集形状,共同构成了张量的稀疏表示。

在tensorflow 2.0中,它可以被实现为:

x = tf.SparseTensor(values=[7,8],indices=[[1],[4]],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]
 [4]], shape=(2, 1), dtype=int64)

已经根据评论中指出的错误进行了编辑以更正索引。


1
在你的例子中,索引和稀疏张量不匹配,应该是 indices = [1,4] 吗? - yichudu
为什么要指定零的数量呢?如果您有非零元素的索引和张量的维度,那么这些信息不就过时了吗? - Lucas Farias

23

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

对于矩阵和稀疏矩阵,这种关系是类似的。稀疏矩阵在动态系统中很常见,数学家们已经为其开发了许多特殊的运算方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接