Python TensorFlow逻辑运算((A==B)&;(C==D))导致;不兼容的形状:[2]与[3]";
我试图构建以下逻辑表达式-Python TensorFlow逻辑运算((A==B)&;(C==D))导致;不兼容的形状:[2]与[3]";,python,tensorflow,Python,Tensorflow,我试图构建以下逻辑表达式- tf.logical_and(tf.equal(tf.argmax(y_conv,0), tf.argmax(y_,0)), tf.equal(tf.argmax(y_conv,1), tf.argmax(y_,1)), name=None) 但它会导致以下错误- 不兼容的形状:[2]与[3] tf.equal(tf.argmax(y_conv,0),tf.argmax(y_,0))和tf.equal(tf.argmax(y_con
tf.logical_and(tf.equal(tf.argmax(y_conv,0), tf.argmax(y_,0)),
tf.equal(tf.argmax(y_conv,1), tf.argmax(y_,1)), name=None)
但它会导致以下错误-
不兼容的形状:[2]与[3]
tf.equal(tf.argmax(y_conv,0),tf.argmax(y_,0))
和tf.equal(tf.argmax(y_conv,1),tf.argmax(y_,1))
分别工作正常,只有tf.logical_和
发生错误tf.logical_和
需要布尔张量,而tf.equal
返回布尔张量,因此所有参数都是有序的,因此不确定它失败的原因
为了提供一些上下文,原始代码如下所示,我只是尝试更新correct_prediction
以包含tf.argmax的0和1
UPDATE1 Start(这将添加所有变量声明)
UPDATE1 End(这将添加所有变量声明)
这就是问题所在-
y_ = tf.placeholder(tf.float32, shape=[None, 2])
y_conv = tf.matmul(h_fc1_drop, W_fc2) + b_fc2
#This works - correct_prediction = tf.equal(tf.argmax(y_conv,0), tf.argmax(y_,0)) . Changed it to -
correct_prediction = tf.logical_and(tf.equal(tf.argmax(y_conv,0), tf.argmax(y_,0)),
tf.equal(tf.argmax(y_conv,1), tf.argmax(y_,1)),
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
sess.run(tf.global_variables_initializer())
train_step.run(feed_dict={x: xtrain, y_: ytrain, keep_prob: 0.5})
#In debugging mode, code breaks at the below line
print("test accuracy %g"%accuracy.eval(feed_dict={x: xtest, y_: ytest, keep_prob: 1.0}))
如何调试此错误?问题的出现是因为tf.equal()
是一个元素操作,它返回一个与参数形状相同的张量。修复表达式的最简单方法是使用tf.reduce_all()
在计算tf.logical_和()
之前,将tf.equal()
的结果聚合为一个标量,如下所示:
tf.logical_and(
tf.reduce_all(tf.equal(tf.argmax(y_conv, 0), tf.argmax(y_, 0))),
tf.reduce_all(tf.equal(tf.argmax(y_conv,1), tf.argmax(y_,1))))
你认为你能把它提炼成一个简单的自给自足的10号班轮吗?那会有帮助的。完成。我对python和tensorflow不够精通,无法将其改写为更小的版本,但我在单独的一节“UPDATE 1”中添加了缺少的代码。但问题的核心是,为什么tf.logical_和(tf.equal(…),tf.equal(…)
都失败了,而tf.equal(…)
都能正常工作。tf.equal
返回布尔张量,而tf.logical_和
需要布尔张量,那么为什么它会失败呢?
tf.logical_and(
tf.reduce_all(tf.equal(tf.argmax(y_conv, 0), tf.argmax(y_, 0))),
tf.reduce_all(tf.equal(tf.argmax(y_conv,1), tf.argmax(y_,1))))