tf.SparseTensor和tf.while_loop的问题

时间:2018-10-14 11:54:15

标签: python tensorflow

当我尝试更改tf.SparseTensortf.while_loop的形状时遇到问题。假设我有这个稀疏张量:

indices = np.array([[0, 0], [0, 1], [0, 2], [0, 3], [0, 4], [0, 5],
               [1, 0], [1, 1], [1, 3], [1, 4], [1, 5],
               [2, 1], [2, 2], [2, 3], [2, 4],
               [3, 0], [3, 1], [3, 2], [3, 3], [3, 4], [3, 5],
               [4, 0], [4, 2], [4, 3], [4, 4], [4, 5]], dtype=np.int64)

values = np.array([7, 6, 7, 4, 5, 4,
              6, 7, 4, 3, 4,
              3, 3, 1, 1,
              1, 2, 2, 3, 3, 4,
              1, 1, 2, 3, 3], dtype=np.float64)

dense_shape = np.array([5, 6], dtype=np.int64)

tRatings = tf.SparseTensor(indices, values, dense_shape)

所以,我想从前三行中切出一片。我知道为此可以使用tf.sparse_slice,但这是一个示例。在我的真实代码中,我从稀疏的Tensor中收集了多行,这些行不是连续的。我写的代码是这样的:

subTensor = tf.sparse_slice(tRatings, [0, 0], [1, 6])

i = tf.constant(1)
def condition(i, sub):
    return tf.less(i, 3)

def body(i, sub):
    tempUser = tf.sparse_slice(tRatings, [i, 0], [1, 6])
    sub = tf.sparse_concat(axis = 0, sp_inputs = [sub, tempUser])
    return [tf.add(i, 1), sub]

subTensor = tf.while_loop(condition1, body1, [i, subTensor], shape_invariants=[i.get_shape(), tf.TensorShape([2])])[1] 

在我运行它时由于某种原因不起作用。我明白了:

ValueError: Dimensions 1 and 2 are not compatible

https://www.tensorflow.org/api_docs/python/tf/while_loop表示:

shape_invariants参数允许调用者为每个循环变量指定一个不太具体的形状不变式,如果形状在两次迭代之间变化,则需要此形式。 tf.Tensor.set_shape函数也可以在body函数中使用,以指示输出循环变量具有特定形状。对SparseTensor和IndexedSlices的形状不变量进行以下特殊处理:

a)如果循环变量是SparseTensor,则形状不变量必须为TensorShape([r]),其中r是由稀疏张量表示的密集张量的秩。这意味着SparseTensor的三个张量的形状为[[None],[None,r],[r])。注意:这里的形状不变是SparseTensor.dense_shape属性的形状。它必须是矢量的形状。

我在这里想念什么?

1 个答案:

答案 0 :(得分:0)

有两个问题。 首先是Tensorflow代码中的问题。将this line更改为:

var.indices.set_shape(tensor_shape.TensorShape([None, shape[0]]))

您的代码中的另一个小问题。您必须将int64类型用于索引变量:

i = tf.constant(1, dtype=tf.int64)