阅读(4123) (12)

TensorFlow稀疏张量:tf.sparse_merge函数

2018-02-28 11:24:36 更新

tf.sparse_merge 函数

sparse_merge(
    sp_ids,
    sp_values,
    vocab_size,
    name=None,
    already_sorted=False
)

定义在:tensorflow/python/ops/sparse_ops.py.

请参阅指南:稀疏张量>转变

将一批特征 ID 和值合并为一个 SparseTensor.

当特征 ID 及其对应值存储在磁盘上的 Example 原型中时,就会出现此函数的最常见用例.parse_example将返回一个批次 ID 和批次值,并且这个函数将它们加入到一个逻辑 SparseTensor 中,以便在 sparse_tensor_dense_matmul、sparse_to_dense 等函数中使用.

此函数返回的 SparseTensor 具有以下属性:

  • indices:相当于 sp_ids.indices 的最后一个维度的索引,并替换为 sp_ids.values.
  • values:只是 sp_values.values.
  • 如果 sp_ids.dense_shape = [D0, D1, ..., Dn, K],那么 output.shape = [D0, D1, ..., Dn, vocab_size].

例如,考虑以下特征向量:

vector1 = [-3, 0, 0, 0, 0, 0]
vector2 = [ 0, 1, 0, 4, 1, 0]
vector3 = [ 5, 0, 0, 9, 0, 0]

在下面的 Example 原型中,这些可能会被存储为稀疏的,只需将特征 id (如果将向量作为矩阵处理的列号) 存储在非零元素和相应的值上:

examples = [Example(features={
                "ids": Feature(int64_list=Int64List(value=[0])),
                "values": Feature(float_list=FloatList(value=[-3]))}),
            Example(features={
                "ids": Feature(int64_list=Int64List(value=[1, 4, 3])),
                "values": Feature(float_list=FloatList(value=[1, 1, 4]))}),
            Example(features={
                "ids": Feature(int64_list=Int64List(value=[0, 3])),
                "values": Feature(float_list=FloatList(value=[5, 9]))})]

对这些示例调用 parse_example 的结果将生成一个包含“ids”和“values”项的字典.将这两个对象与 vocab_size = 6 一起传递给此函数将生成一个SparseTensor,稀疏表示所有三个实例的表达式.也就是说,indices 属性将包含特征矩阵中非零项的坐标(第一维是矩阵中的行号,即批次内的索引,第二维是列号,即特征 ID);values 将包含实际值.shape 将是原始矩阵的形状,即(3,6).对于上面的例子,输出将等于:

SparseTensor(indices=[[0, 0], [1, 1], [1, 3], [1, 4], [2, 0], [2, 3]],
             values=[-3, 1, 4, 1, 5, 9],
             dense_shape=[3, 6])

该方法通过简单地提供 sp_ids 以及 vocab_size 的列表来推广到更高维度.在这种情况下,产生的 SparseTensor 具有以下属性: - indices:相当于sp_ids[0].indices的最后一个维度使用 sp_ids[0].values 和 sp_ids[1].values 等被丢弃并连接在一起.- values:只是 sp_values.values.如果sp_ids.dense_shape = [D0, D1, ..., Dn, K],则 output.shape = [D0, D1, ..., Dn] + vocab_size.

函数参数:

  • sp_ids:具有 int32 或者 int64 类型的 values 属性的单个 SparseTensor,或者此类 SparseTensors 的 Python列表或其列表.
  • sp_values:任何类型的 SparseTensor.
  • vocab_size:标量 int64 Tensor(或 Python INT)包含最后一个维度的新大小, all(0 <= sp_ids.values < vocab_size).或者对于 i,所有的列表都有,all(0 <= sp_ids[i].values < vocab_size[i]).
  • name:返回张量的名称前缀(可选)
  • already_sorted:一个布尔值,用于指定 sp_values 中的每个批次的值是否已经排序.如果是则跳过排序,默认为False(可选).

函数返回值:

一个 SparseTensor,它紧凑地表示一批特征 id 和值,对于传递到期望此类 SparseTensor 的函数非常有用.

可能引发的异常:

  • TypeError:如果 sp_values 不是SparseTensor;或者如果 sp_ids 既不是 SparseTensor 也不是它的列表;或者如果 vocab_size 不是 Tensor 或Python int,并且 sp_ids 是 SparseTensor;或者如果 vocab_size 不是一个或其中的列表,并且 sp_ids 是列表.这些情况下将引发 TypeError.
  • ValueError:如果 sp_ids 和 vocab_size 是不同长度的列表.