尝试堆叠两个参差不齐的张量时出错
Error when trying to stack two ragged tensors
我在尝试使用 tf.ragged.stack
时遇到了一个奇怪的错误。我正在尝试堆叠两个张量 t1、t2,但它们的秩不同。 t2 比 t1 低 1 个等级。因此,我使用 tf.expand_dims
来增加 t2 的排名,以便排名匹配。然而,当我去堆叠它们时,我得到一个错误:
import tensorflow as tf
t1 = tf.ones([2,10,10], tf.int32)
t2 = tf.ragged.constant([
[0,1,2,3,4,5],
[0,1,2,3,4]
])
t2 = tf.expand_dims(t2, -1)
tf.ragged.stack([t1, t2])
我得到的错误是
InvalidArgumentError: ConcatOp : Dimensions of inputs should match: shape[0] = [20,10] vs. shape[1] = [11,1] [Op:ConcatV2] name: concat
然而,当我从头开始创建等效张量时,我没有收到错误。
t2_new = tf.ragged.constant([
[[0],[1],[2],[3],[4],[5]],
[[0],[1],[2],[3],[4]]
tf.ragged.stack([t1, t2_new]) # no error
t2 和 t2 new 的区别在于,tensorflow 认为它们的形状不同,即使它们实际上表示相同的张量
print(t2.shape) # == (2,None,1)
print(t2_new.shape) # == (2, None, None)
print(tf.math.reduce_all(t2 == t2_new)) # == True i.e actually the same tensor
它实际上并不是那么微不足道,因为 tf.expand_dims
添加了一个新维度,而不是 ragged 维度,即之后有必要堆叠两个张量。一般来说,这是可能的,但比仅仅添加一个新维度要复杂一些。我建议使用 tf.RaggedTensor.from_value_rowids with tf.RaggedTensor.from_row_splits:
import tensorflow as tf
t1 = tf.ones([2,10,10], tf.int32)
t2 = tf.ragged.constant([[0,1,2,3,4,5],
[0,1,2,3,4]])
t2_new = tf.ragged.constant([
[[0],[1],[2],[3],[4],[5]],
[[0],[1],[2],[3],[4]]])
flattened_ragged_tensor = t2.flat_values
rows = tf.cast(t2.bounding_shape()[0], dtype=tf.int32)
t2 = tf.RaggedTensor.from_value_rowids(
values=tf.RaggedTensor.from_row_splits(
values=flattened_ragged_tensor,
row_splits=tf.range(tf.shape(flattened_ragged_tensor)[0] + 1)),
value_rowids=tf.concat([tf.tile([i], [t2[i].shape[0]]) for i in tf.range(rows)], axis=0),
nrows=rows)
print(t2.shape)
print(t2_new.shape)
print(tf.ragged.stack([t1, t2]))
print(tf.ragged.stack([t1, t2_new]))
(2, None, None)
(2, None, None)
<tf.RaggedTensor [[[[1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]], [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]], [[[0], [1], [2], [3], [4], [5]], [[0], [1], [2], [3], [4]]]]>
<tf.RaggedTensor [[[[1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]], [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]], [[[0], [1], [2], [3], [4], [5]], [[0], [1], [2], [3], [4]]]]>
我在尝试使用 tf.ragged.stack
时遇到了一个奇怪的错误。我正在尝试堆叠两个张量 t1、t2,但它们的秩不同。 t2 比 t1 低 1 个等级。因此,我使用 tf.expand_dims
来增加 t2 的排名,以便排名匹配。然而,当我去堆叠它们时,我得到一个错误:
import tensorflow as tf
t1 = tf.ones([2,10,10], tf.int32)
t2 = tf.ragged.constant([
[0,1,2,3,4,5],
[0,1,2,3,4]
])
t2 = tf.expand_dims(t2, -1)
tf.ragged.stack([t1, t2])
我得到的错误是
InvalidArgumentError: ConcatOp : Dimensions of inputs should match: shape[0] = [20,10] vs. shape[1] = [11,1] [Op:ConcatV2] name: concat
然而,当我从头开始创建等效张量时,我没有收到错误。
t2_new = tf.ragged.constant([
[[0],[1],[2],[3],[4],[5]],
[[0],[1],[2],[3],[4]]
tf.ragged.stack([t1, t2_new]) # no error
t2 和 t2 new 的区别在于,tensorflow 认为它们的形状不同,即使它们实际上表示相同的张量
print(t2.shape) # == (2,None,1)
print(t2_new.shape) # == (2, None, None)
print(tf.math.reduce_all(t2 == t2_new)) # == True i.e actually the same tensor
它实际上并不是那么微不足道,因为 tf.expand_dims
添加了一个新维度,而不是 ragged 维度,即之后有必要堆叠两个张量。一般来说,这是可能的,但比仅仅添加一个新维度要复杂一些。我建议使用 tf.RaggedTensor.from_value_rowids with tf.RaggedTensor.from_row_splits:
import tensorflow as tf
t1 = tf.ones([2,10,10], tf.int32)
t2 = tf.ragged.constant([[0,1,2,3,4,5],
[0,1,2,3,4]])
t2_new = tf.ragged.constant([
[[0],[1],[2],[3],[4],[5]],
[[0],[1],[2],[3],[4]]])
flattened_ragged_tensor = t2.flat_values
rows = tf.cast(t2.bounding_shape()[0], dtype=tf.int32)
t2 = tf.RaggedTensor.from_value_rowids(
values=tf.RaggedTensor.from_row_splits(
values=flattened_ragged_tensor,
row_splits=tf.range(tf.shape(flattened_ragged_tensor)[0] + 1)),
value_rowids=tf.concat([tf.tile([i], [t2[i].shape[0]]) for i in tf.range(rows)], axis=0),
nrows=rows)
print(t2.shape)
print(t2_new.shape)
print(tf.ragged.stack([t1, t2]))
print(tf.ragged.stack([t1, t2_new]))
(2, None, None)
(2, None, None)
<tf.RaggedTensor [[[[1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]], [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]], [[[0], [1], [2], [3], [4], [5]], [[0], [1], [2], [3], [4]]]]>
<tf.RaggedTensor [[[[1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]], [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]], [[[0], [1], [2], [3], [4], [5]], [[0], [1], [2], [3], [4]]]]>