sem*_*ari 1 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'
Run Code Online (Sandbox Code Playgroud)
mrr*_*rry 12
该tf.equal()操作是按元素操作.假设x和y具有相同的形状(因为它们是在你的例子)tf.equal(x, y)将产生具有相同的形状,其中每个元素指示在相应的元件是否张量x和y是相等的.因此,sess.run(tf.equal(y, y))在您的程序中将返回数组[True, True, True].
在Python中,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'
Run Code Online (Sandbox Code Playgroud)
*请注意,如果它们具有不同的形状,tf.equal(x, y)它将广播其参数,因此您可能会得到意外的结果,即使用此程序,两个具有不同形状的张量"相等".例如,对列向量[[11], [22]]和行向量使用此测试[11, 22]将指示这些是相等的.如果您还需要形状在平等的测试比较,你也应该比较的结果tf.shape(x)和tf.shape(y).