下面是我传递给keras Lambda层的函数。tf.cond()
的输出有问题。它返回<unknown>
的形状。输入Tensor(t)和恒定权重Tensor分别具有(None,6)
和(6,)
的形状。当我在tf.cond()
之外加上这两个时,我得到一个形状为(None,6)
的Tensor,这就是我需要的。然而,当从tf.cond()
中返回相同的加法操作时,我得到的Tensor形状为<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
1条答案
按热度按时间1sbrub3j1#
你的代码中有一些问题。
tf.math.segment_mean()
期望class_segments
具有与输入t
的第一个维度相同的形状。因此,None
必须等于6
才能使代码运行。这很可能是你得到 unknown 形状的原因-因为Tensor的形状取决于None
,这是在运行时确定的。您可以应用转换来运行代码(不确定这是否是您试图实现的目标),例如。1.在
tf.cond()
中,true_fn
和false_fn
必须返回相同形状的Tensor。在你的例子中,true_fn
返回(None, 6)
,因为broadcasting和false_fn
返回形状为(6,)
的Tensor。tf.cond()
中的 predicate 必须降阶为0。例如,如果要应用b = tf.math.argmax(tf.math.segment_mean(tf.transpose(t), class_segments), 0)
,则b
的形状将是(None)
,而tf.cond()
中的 predicatepred
将是broadcasted(这将引发错误)。