当我尝试更改tf.SparseTensor
内tf.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属性的形状。它必须是矢量的形状。
我在这里想念什么?
答案 0 :(得分:0)
有两个问题。 首先是Tensorflow代码中的问题。将this line更改为:
var.indices.set_shape(tensor_shape.TensorShape([None, shape[0]]))
您的代码中的另一个小问题。您必须将int64类型用于索引变量:
i = tf.constant(1, dtype=tf.int64)