阅读(4794) (11)

TensorFlow稀疏张量函数:tf.SparseTensor

2018-01-31 10:27:43 更新

tf.SparseTensor 函数

SparseTensor 类

定义在:tensorflow/python/framework/sparse_tensor.py.

参见指南:稀疏张量>稀疏张量表示

代表稀疏张量.

TensorFlow表示一个稀疏张量,作为三个独立的稠密张量:indices,values和dense_shape.在Python中,三个张量被集合到一个SparseTensor类中,以方便使用.如果你有单独的indices,values和dense_shape张量,SparseTensor在传递给下面的操作之前,将它们包装在一个对象中.

具体来说,该稀疏张量SparseTensor(indices, values, dense_shape)包括以下组件,其中N和ndims分别是在SparseTensor中的值的数目和维度的数量:

  • indices:density_shape[N, ndims]的2-D int64张量,指定稀疏张量中包含非零值(元素为零索引)的元素的索引.例如,indices=[[1,3], [2,4]]指定索引为[1,3]和[2,4]的元素具有非零值.
  • values:任何类型和dense_shape [N]的一维张量,它提供了indices中的每个元素的值.例如,给定indices=[[1,3], [2,4]]的参数values=[18, 3.6]指定稀疏张量的元素[1,3]的值为18,张量的元素[2,4]的值为3.6.
  • dense_shape:density_shape[ndims]的一个1-D int64张量,指定稀疏张量的dense_shape.获取一个列表,指出每个维度中元素的数量.例如,dense_shape=[3,6]指定二维3x6张量,dense_shape=[2,3,4]指定三维2x3x4张量,并且dense_shape=[9]指定具有9个元素的一维张量.

相应的稠密张量满足:

dense.shape = dense_shape
dense[tuple(indices[i])] = values[i]

按照惯例,indices应该按行优先顺序排列(或者在元组上等效地按字典排序indices[i]).当构造SparseTensor对象时,这不是强制执行的,但大多数操作都假定正确的顺序.如果稀疏张量st的排序是错误的,可以通过调用tf.sparse_reorder(st)来获得一个固定的版本.

例如:稀疏张量表示:

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]]

属性

  • dense_shape
    int64的一维张量,表示稠密张量的形状.
  • dtype
    在这个张量中元素的DType.
  • graph
    包含 index,value和dense_shape张量的Graph.
  • indices
    表示稠密张量中非零值的指标.
    返回:
    带有dense_shape[N, ndims]的类型为int64的二维张量,其中N是张量中的非零值的数量,并且ndims是秩.
  • op
    产生values作为输出的Operation.
  • values
    表示稠密张量中的非零值.
    返回:
  • 任何数据类型的一维张量.

方法

__init__方法

__init__(
    indices,
    values,
    dense_shape
)

创建一个SparseTensor.

__init__ 方法参数:

  • indices:一个形状为[N, ndims]的二维int64张量.
  • values:任何类型和形状[N]的一维张量.
  • dense_shape:形状为[ndims]的1-D int64张量.

__init__ 方法返回:

该方法返回一个SparseTensor.

__div__方法

__div__(
    sp_x,
    y
)

Component-wise 用稠密张量除以 SparseTensor.

限制:这个操作只向稀疏的一面播放密集的一面,而不是其他的方向.

方法参数:

  • sp_indices:int64 类型的张量,是2维的;N x R矩阵具有SparseTensor中的非空值索引,可能不符合规范排序.
  • sp_values:一个张量;必须是下列类型之一:float32,float64,int64,int32,uint8,uint16,int16,int8,complex64,complex128,qint8,quint8,qint32,half;是一维的.N的非空值对应sp_indices.
  • sp_shape:int64 类型的张量,是一维的;输入SparseTensor的形状.
  • dense:一个张量,必须与sp_values具有相同的类型;R-D;密集的张量操作数.
  • name:操作的名称(可选).

方法返回:

该方法返回一个与sp_values有相同的类型的张量,它是1维的;运行的N值.

__mul__方法

__mul__(
    sp_x,
    y
)

按Component-wise方式将SparseTensor乘以一个稠密的张量.

与稀疏张量中的隐含零元素相对应的输出位置将是零(即不会占用存储空间),而与密集张量的内容无关(即使它是+/- INF,且INF * 0 == NAN).

限制:这个操作只向稀疏的一面播放密集的一面,而不是其他的方向.

方法参数:

  • sp_indices:int64类型的张量,是2维的,N x R矩阵具有SparseTensor中的非空值索引,可能不符合规范排序.
  • sp_values:一个张量;必须是下列类型之一:float32,float64,int64,int32,uint8,uint16,int16,int8,complex64,complex128,qint8,quint8,qint32,half;是一维的;N的非空值对应sp_indices.
  • sp_shape:int64类型的张量,是1维的;输入SparseTensor的形状.
  • dense:一个张量;必须与sp_values具有相同的类型;R-D;密集的张量操作数.
  • name:操作的名称(可选).

方法返回:

该方法返回一个与sp_values有相同的类型;这个张量是一维的;运行的N值.

__truediv__方法

__truediv__(
    sp_x,
    y
)

内部帮助函数'sp_t / dense_t'.

eval 方法

eval(
    feed_dict=None,
    session=None
)

在一个Session中计算这个稀疏张量.

调用此方法将执行所有前面的操作,这些操作会生成产生此张量的操作所需的输入.

注意:在调用SparseTensor.eval()之前,它的关系图必须已经在Session中启动,并且默认Session必须是可用的,否则session必须明确指定.

方法参数:

  • feed_dict:将Tensor对象映射到Feed值的字典.请参阅tf.Session.run以得到有效的Feed值的说明.
  • session:(可选)Session用来计算这个稀疏张量.如果没有,将使用默认Session.

方法返回:

该方法返回一个SparseTensorValue对象.

from_value

@classmethod
from_value(
    cls,
    sparse_tensor_value
)

get_shape

get_shape()

得到TensorShape,它表示稠密张量的形状.

方法返回:

该方法返回一个TensorShape对象.