我很难理解Tensorflow Tensors 和 Sparse Tensors 的含义和用法。
根据文件
张量
Tensor是一种打字的多维数组。例如,您可以将一小批图像表示为具有维度[批次,高度,宽度,通道]的浮点数的4维数组。
稀疏张量
TensorFlow将稀疏张量表示为三个独立的密集张量:索引,值和形状。在Python中,三个张量被收集到SparseTensor类中以便于使用。如果您有单独的索引,值和形状张量,请在传递给下面的操作之前将它们包装在SparseTensor对象中。
我的理解是Tensors用于操作,输入和输出。而Sparse Tensor只是Tensor的另一种表现形式(密集?)。希望有人能够进一步解释它们之间的差异和用例。
答案 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)