TensorFlow tf.equal()运算符不能按预期工作

时间:2017-01-26 13:55:45

标签: python-2.7 tensorflow

我写了以下代码, 但它没有像我期望的那样工作。 我预计会打印'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'

1 个答案:

答案 0 :(得分:10)

tf.equal()运算符是元素运算符。假设xy具有相同的形状(如您的示例中所示)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)的结果。