tf.cond() 返回形状未知的张量
tf.cond() returning a tensor of shape unknown
下面是我传递给 keras Lambda 层的函数。
tf.cond()
的输出出现问题。它returns一个<unknown>
的形状。输入张量 (t) 和常量张量的形状分别为 (None,6)
和 (6,)
。当我在 tf.cond()
之外添加这两个时,我得到一个形状为 (None,6)
的张量,这正是我需要的。但是,当从 tf.cond()
中返回相同的添加操作时,我得到一个形状为 <unknown>
.
的张量
当此操作通过 tf.cond()
时发生了什么变化。
def class_segmentation(t):
class_segments = tf.constant([0,0,1,1,2,2])
a = tf.math.segment_mean(t, class_segments, name=None)
b = tf.math.argmax(a)
left_weights = tf.constant([1.0,1.0,0.0,0.0,0.0,0.0])
middle_weights = tf.constant([0.0,0.0,1.0,1.0,0.0,0.0])
right_weights = tf.constant([0.0,0.0,0.0,0.0,1.0,1.0])
zero_weights = tf.constant([0.0,0.0,0.0,0.0,0.0,0.0])
c = tf.cond(tf.math.equal(b,0), lambda: tf.math.add(t, left_weights), lambda: zero_weights)
d = tf.cond(tf.math.equal(b,1), lambda: tf.math.add(t, middle_weights ), lambda: zero_weights)
e = tf.cond(tf.math.equal(b,2), lambda: tf.math.add(t, right_weights), lambda: zero_weights)
f = tf.math.add_n([c,d,e])
print("Tensor shape: ", f.shape) # returns "Unknown"
return f
你的代码有一些问题。
tf.math.segment_mean()
期望 class_segments
与输入的第一个维度 t
具有相同的形状。因此 None
必须等于 6
才能使您的代码成为 运行。这很可能是导致您获得 unknown 形状的原因 - 因为您的张量的形状取决于 None
,这是在 运行 时间确定的。您可以将代码转换为 运行(不确定这是否是您要实现的目标),例如
a = tf.math.segment_mean(tf.transpose(t), class_segments)
- 在
tf.cond()
true_fn
and false_fn
must return tensors of same shape. In your case true_fn
returns (None, 6)
because of broadcasting 和 false_fn
returns 张量中 (6,)
.
tf.cond()
中的谓词必须降为 0 级。例如,如果您要申请
b = tf.math.argmax(tf.math.segment_mean(tf.transpose(t), class_segments), 0)
那么 b
的形状将是 (None)
并且 tf.cond()
中的谓词 pred
将被 广播 到相同的形状(这将引发错误)。
在不知道你想要什么的情况下,不可能获得进一步的帮助。
下面是我传递给 keras Lambda 层的函数。
tf.cond()
的输出出现问题。它returns一个<unknown>
的形状。输入张量 (t) 和常量张量的形状分别为 (None,6)
和 (6,)
。当我在 tf.cond()
之外添加这两个时,我得到一个形状为 (None,6)
的张量,这正是我需要的。但是,当从 tf.cond()
中返回相同的添加操作时,我得到一个形状为 <unknown>
.
当此操作通过 tf.cond()
时发生了什么变化。
def class_segmentation(t):
class_segments = tf.constant([0,0,1,1,2,2])
a = tf.math.segment_mean(t, class_segments, name=None)
b = tf.math.argmax(a)
left_weights = tf.constant([1.0,1.0,0.0,0.0,0.0,0.0])
middle_weights = tf.constant([0.0,0.0,1.0,1.0,0.0,0.0])
right_weights = tf.constant([0.0,0.0,0.0,0.0,1.0,1.0])
zero_weights = tf.constant([0.0,0.0,0.0,0.0,0.0,0.0])
c = tf.cond(tf.math.equal(b,0), lambda: tf.math.add(t, left_weights), lambda: zero_weights)
d = tf.cond(tf.math.equal(b,1), lambda: tf.math.add(t, middle_weights ), lambda: zero_weights)
e = tf.cond(tf.math.equal(b,2), lambda: tf.math.add(t, right_weights), lambda: zero_weights)
f = tf.math.add_n([c,d,e])
print("Tensor shape: ", f.shape) # returns "Unknown"
return f
你的代码有一些问题。
tf.math.segment_mean()
期望class_segments
与输入的第一个维度t
具有相同的形状。因此None
必须等于6
才能使您的代码成为 运行。这很可能是导致您获得 unknown 形状的原因 - 因为您的张量的形状取决于None
,这是在 运行 时间确定的。您可以将代码转换为 运行(不确定这是否是您要实现的目标),例如
a = tf.math.segment_mean(tf.transpose(t), class_segments)
- 在
tf.cond()
true_fn
andfalse_fn
must return tensors of same shape. In your casetrue_fn
returns(None, 6)
because of broadcasting 和false_fn
returns 张量中(6,)
. tf.cond()
中的谓词必须降为 0 级。例如,如果您要申请b = tf.math.argmax(tf.math.segment_mean(tf.transpose(t), class_segments), 0)
那么b
的形状将是(None)
并且tf.cond()
中的谓词pred
将被 广播 到相同的形状(这将引发错误)。
在不知道你想要什么的情况下,不可能获得进一步的帮助。