【发布时间】: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