张量流错误 map_fn。无法指定输出签名
Error with tensorflow map_fn. Unable to specify output signature
我正在尝试使用 tensorflow 的 tf.map_fn 来映射参差不齐的张量,但我遇到了无法修复的错误。
下面是一些演示错误的最小代码:
import tensorflow as tf
X = tf.ragged.constant([[0,1,2], [0,1]])
def outer_product(x):
return x[...,None]*x[None,...]
tf.map_fn(outer_product, X)
我想要的输出是:
tf.ragged.constant([
[[0, 0, 0],
[0, 1, 2],
[0, 2, 4]],
[[0, 0],
[0, 1]]
])
我得到的错误是:
"InvalidArgumentError: All flat_values must have compatible shapes.
Shape at index 0: [3]. Shape at index 1: [2]. If you are using
tf.map_fn, then you may need to specify an explicit
fn_output_signature with appropriate ragged_rank, and/or convert
output tensors to RaggedTensors. [Op:RaggedTensorFromVariant]"
我知道我需要指定 fn_output_signature,但尽管进行了试验,我还是不知道应该指定什么。
编辑:我稍微整理了一下 AloneTogether 的出色答案并创建了一个函数来映射参差不齐的张量。他的回答使用 tf.ragged.stack
函数将张量转换为参差不齐的张量,tf.map_fn
出于某种原因需要
def ragged_map_fn(func, t):
def new_func(t):
return tf.ragged.stack(func(t),0)
signature = tf.type_spec_from_value(new_func(t[0]))
ans = tf.map_fn(new_func, t, fn_output_signature=signature)
ans = tf.squeeze(ans, 1)
return ans
参差不齐的张量有时真的很棘手。这是您可以尝试的一个选项:
import tensorflow as tf
X = tf.ragged.constant([
[0,1,2],
[0,1]
])
def outer_product(x):
t = x[...,None] * x[None,...]
return tf.ragged.stack(t)
y = tf.map_fn(outer_product, X, fn_output_signature=tf.RaggedTensorSpec(shape=[1, None, None],
dtype=tf.type_spec_from_value(X).dtype,
ragged_rank=2,
row_splits_dtype=tf.type_spec_from_value(X).row_splits_dtype))
tf.print(y)
#y = tf.concat([y[0, :], y[1, :]], axis=0) # Remove additional dimension from Ragged Tensor
y = y.merge_dims(0, 1)
tf.print(y)
[
[
[
[0, 0, 0],
[0, 1, 2],
[0, 2, 4]
]
],
[
[
[0, 0],
[0, 1]
]
]
]
并且在使用 y.merge_dims(0, 1)
或 tf.concat
删除附加维度后:
[
[
[0, 0, 0],
[0, 1, 2],
[0, 2, 4]
],
[
[0, 0],
[0, 1]
]
]
我正在尝试使用 tensorflow 的 tf.map_fn 来映射参差不齐的张量,但我遇到了无法修复的错误。 下面是一些演示错误的最小代码:
import tensorflow as tf
X = tf.ragged.constant([[0,1,2], [0,1]])
def outer_product(x):
return x[...,None]*x[None,...]
tf.map_fn(outer_product, X)
我想要的输出是:
tf.ragged.constant([
[[0, 0, 0],
[0, 1, 2],
[0, 2, 4]],
[[0, 0],
[0, 1]]
])
我得到的错误是:
"InvalidArgumentError: All flat_values must have compatible shapes. Shape at index 0: [3]. Shape at index 1: [2]. If you are using tf.map_fn, then you may need to specify an explicit fn_output_signature with appropriate ragged_rank, and/or convert output tensors to RaggedTensors. [Op:RaggedTensorFromVariant]"
我知道我需要指定 fn_output_signature,但尽管进行了试验,我还是不知道应该指定什么。
编辑:我稍微整理了一下 AloneTogether 的出色答案并创建了一个函数来映射参差不齐的张量。他的回答使用 tf.ragged.stack
函数将张量转换为参差不齐的张量,tf.map_fn
出于某种原因需要
def ragged_map_fn(func, t):
def new_func(t):
return tf.ragged.stack(func(t),0)
signature = tf.type_spec_from_value(new_func(t[0]))
ans = tf.map_fn(new_func, t, fn_output_signature=signature)
ans = tf.squeeze(ans, 1)
return ans
参差不齐的张量有时真的很棘手。这是您可以尝试的一个选项:
import tensorflow as tf
X = tf.ragged.constant([
[0,1,2],
[0,1]
])
def outer_product(x):
t = x[...,None] * x[None,...]
return tf.ragged.stack(t)
y = tf.map_fn(outer_product, X, fn_output_signature=tf.RaggedTensorSpec(shape=[1, None, None],
dtype=tf.type_spec_from_value(X).dtype,
ragged_rank=2,
row_splits_dtype=tf.type_spec_from_value(X).row_splits_dtype))
tf.print(y)
#y = tf.concat([y[0, :], y[1, :]], axis=0) # Remove additional dimension from Ragged Tensor
y = y.merge_dims(0, 1)
tf.print(y)
[
[
[
[0, 0, 0],
[0, 1, 2],
[0, 2, 4]
]
],
[
[
[0, 0],
[0, 1]
]
]
]
并且在使用 y.merge_dims(0, 1)
或 tf.concat
删除附加维度后:
[
[
[0, 0, 0],
[0, 1, 2],
[0, 2, 4]
],
[
[0, 0],
[0, 1]
]
]