Keras后端是否有类似TensorFlow的tf.logical_and()/tf.logical_or()的布尔张量比较函数?
解决Keras后端中张量间逻辑与/或的问题
其实不用嵌套K.switch()这么麻烦,有两种更简洁的方式来实现类似TensorFlow中tf.logical_and()和tf.logical_or()的功能,分情况来看:
方法一:利用算术运算(跨后端通用)
Keras后端的布尔张量本质是以float32类型存储的,True对应1.0,False对应0.0,所以我们可以用基础算术运算直接模拟逻辑操作:
逻辑与(对应
tf.logical_and):
用x * y或者K.minimum(x, y),只有当两个张量对应位置都为True(1.0)时,结果才是1.0(True),否则为0.0(False)。逻辑或(对应
tf.logical_or):
用K.maximum(x, y)或者K.minimum(x + y, 1),只要两个张量对应位置有一个为True(1.0),结果就是1.0(True),否则为0.0(False)。
举个实际例子:
import keras.backend as K # 创建两个布尔张量 x = K.equal(K.constant([1, 0, 1]), K.constant([1, 1, 0])) # 输出:[True, False, False] y = K.equal(K.constant([1, 1, 0]), K.constant([1, 1, 0])) # 输出:[True, True, False] # 实现逻辑与 logical_and_result = x * y # 等价于 K.minimum(x, y) # 结果:[True, False, False] # 实现逻辑或 logical_or_result = K.maximum(x, y) # 等价于 K.minimum(x + y, 1) # 结果:[True, True, False]
如果需要把结果转回严格的布尔类型,只需要用K.cast(logical_and_result, 'bool')即可。
方法二:直接调用TensorFlow原生函数(仅TF后端可用)
如果你的Keras是基于TensorFlow后端的,其实可以直接使用tf.logical_and()和tf.logical_or(),因为Keras张量和TensorFlow张量是完全兼容的,不需要额外转换,比如:
import tensorflow as tf import keras.backend as K x = K.equal(K.constant([1,0,1]), K.constant([1,1,0])) y = K.equal(K.constant([1,1,0]), K.constant([1,1,0])) logical_and_result = tf.logical_and(x, y) logical_or_result = tf.logical_or(x, y)
这种方式最直接,但缺点是代码会绑定TensorFlow后端,如果以后要切换到其他后端(比如Theano)就会失效。
相比嵌套K.switch(),上面两种方法都要简洁优雅得多,推荐优先用第一种跨后端的方案。
内容的提问来源于stack exchange,提问作者dashnick
相关产品推荐
相关产品推荐

