所以我在过去搜索过这个主题,并没有找到任何可行的解决方案。
所以我在这里有一个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)
答案 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,)