【问题标题】:Problem with tf.SparseTensor and tf.while_looptf.SparseTensor 和 tf.while_loop 的问题
【发布时间】:2018-10-15 03:12:36
【问题描述】:

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

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)

所以,我想从前 3 行中取出一个切片。我知道为此我可以使用tf.sparse_slice,但这是一个示例。在我的真实代码中,我从稀疏张量中收集了多行,它们不是串行的。我写的代码是这样的:

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 属性的形状。它必须是矢量的形状。

我在这里错过了什么?

【问题讨论】:

    标签: python tensorflow


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢您的回答。你能按原样写给我吗?什么是 tensor_shape 和 shape?很抱歉给您带来麻烦,但我是新手。
    • 我认为问题出在 tensorflow 核心代码中,因此您应该将这一行更改为安装在您机器上的 tensorflow(或向 tensorflow 存储库发出拉取请求)。在我的回答中,我将代码行链接到 tensorflow 代表,您应该在您的机器上找到它并更改为 var.indices.set_shape(tensor_shape.TensorShape([None, shape[0]]))
    • 好的,知道了。非常感谢您抽出宝贵时间,我会尝试的。
    猜你喜欢
    • 2018-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-12
    • 2016-09-23
    • 1970-01-01
    相关资源
    最近更新 更多