Tensorflow,如何将tf.equals用作布尔值?

时间:2017-10-01 20:51:15

标签: python lambda tensorflow

所以我在过去搜索过这个主题,并没有找到任何可行的解决方案。

所以我在这里有一个lambda函数(我希望/希望应该)迭代一个列表(“iterateOverMe”)并用“1”替换所有等于指定值(“value”)的元素。任何其他值都应标有“9”。

idk = tf.map_fn(lambda x: 1 if tf.equal(tf.cast(x, tf.int32), value) else 9, iterateOverMe, dtype=tf.int32)

但是我收到错误消息,说明以下内容:     “TypeError:不允许使用tf.Tensor作为Python bool。使用if t is not None:代替if t:来测试是否定义了张量,并使用TensorFlow操作比如tf.cond来执行以张量值为条件的子图。“

然而,当我直接打印tf.equal语句时,它给出了预期的True / False值!

我尝试过的事情。

1:在张量上使用reduce_all,不起作用,我仍然得到同样的错误。

TypeError:不允许使用tf.Tensor作为Python bool。使用if t is not None:代替if t:来测试是否定义了张量,并使用TensorFlow操作(如tf.cond)来执行以张量值为条件的子图。

2:使用建议的“if t is not None”,这不起作用,因为无论如何它似乎永远不等于None。

所以我得到一个像这样的1的列表,这是可悲的错误。

[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]

3:尝试使用tf.cond就像这样。但是因为我想要返回真或假根本不起作用。需要有可赎回。     idk = tf.map_fn(lambda x:1 if tf.cond(tf.equal(tf.cast(x,tf.int32),iterator),True,False)else -1,modifiedTrainingLabels,dtype = tf.int32)< / p>

4:这......这种憎恶也没有用。

idk = tf.map_fn(lambda x: 1 if tf.cond(tf.equal(tf.cast(x, tf.int32), iterator), lambda : True, lambda: False) else 9, modifiedTrainingLabels, dtype=tf.int32)

1 个答案:

答案 0 :(得分:0)

您可以使用tf.where()操作执行此操作,该操作可并行评估张量中多个位置的条件;以及tf.fill()操作,它生成给定形状的张量。

假设您有tf.Tensor个10个值,名为iterateOverMe,目标值为value

iterateOverMe = ...                                       # shape: (10,)

mask = tf.equal(tf.cast(iterateOverMe, tf.int32), value)  # shape: (10,)

result = tf.where(mask,
                  tf.fill(tf.shape(iterateOverMe), 1),    # If `mask` is true.
                  tf.fill(tf.shape(iterateOverMe), 9)     # If `mask` is false.
                 )                                        # shape: (10,)