我写了以下代码,
但它没有像我期望的那样工作。
我预计会打印'true'
,但会打印'false'
。
你能解释一下为什么会这样吗?
import tensorflow as tf
#y_ = tf.constant([0, 1, 0])
y = tf.constant([0, 1, 0])
with tf.Session() as sess:
b = sess.run(tf.equal(y, y))
if b is True:
print 'true'
else:
print 'false'
答案 0 :(得分:10)
tf.equal()
运算符是元素运算符。假设x
和y
具有相同的形状(如您的示例中所示)tf.equal(x, y)
将生成具有相同形状的张量,其中每个元素指示{{1}中的对应元素}和x
是平等的。因此,程序中的y
将返回数组sess.run(tf.equal(y, y))
。
在Python中,[True, True, True]
运算符计算两个对象之间的引用相等性,而数组is
与(内置)对象[True, True, True]
不是同一个对象,因此结果测试的结果是True
。
通过在False
的结果上使用tf.reduce_all()
运算符来计算单个布尔值,以下程序将实现您期望的行为 * :
tf.equal()
* 但是请注意y = tf.constant([0, 1, 0])
all_elems_equal = tf.reduce_all(tf.equal(y, y))
with tf.Session() as sess:
b = sess.run(all_elems_equal)
if b:
print 'true'
else:
print 'false'
如果它们具有不同的形状,它们将broadcast它们的参数,因此您可能会得到两个具有不同形状的张量“相等”的意外结果使用这个程序。例如,对列向量tf.equal(x, y)
和行向量[[11], [22]]
使用此测试将表明这些是相等的。如果您还需要比较相等测试中的形状,还应该比较[11, 22]
和tf.shape(x)
的结果。