keras tf.cond()返回形状未知的Tensor

vh0rcniy  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(130)

下面是我传递给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
1sbrub3j

1sbrub3j1#

你的代码中有一些问题。

  1. tf.math.segment_mean()期望class_segments具有与输入t的第一个维度相同的形状。因此,None必须等于6才能使代码运行。这很可能是你得到 unknown 形状的原因-因为Tensor的形状取决于None,这是在运行时确定的。您可以应用转换来运行代码(不确定这是否是您试图实现的目标),例如。
a = tf.math.segment_mean(tf.transpose(t), class_segments)

1.在tf.cond()中,true_fnfalse_fn必须返回相同形状的Tensor。在你的例子中,true_fn返回(None, 6),因为broadcastingfalse_fn返回形状为(6,)的Tensor。

  1. tf.cond()中的 predicate 必须降阶为0。例如,如果要应用b = tf.math.argmax(tf.math.segment_mean(tf.transpose(t), class_segments), 0),则b的形状将是(None),而tf.cond()中的 predicate pred将是broadcasted(这将引发错误)。

相关问题