我正在尝试使用tensorflow软件包构建CNN网络。我的火车数据集是237张具有100X100的图像,共6个类别,测试集是30个具有相同大小和类别的图像。 一切都进行得很好,除了我想用其测量精度的最后一部分
acc=tf.reduce_mean(tf.cast(matches,tf.float32))
我无法理解为什么在我测试兼容“(30,100,100,1)vs(30,6)”的测试集(数据和标签)时会出错。 谁能解释为什么和什么可行的解决方案。
注意:当我在火车数据上应用批次大小30(等于测试集行的数量)时,它可以工作。我假设模型期望火车和测试集的行数应等于未设置的行数(通常是70%的培训与30%的测试),我检查了一些具有相同错误标题的帖子,但面对却无法理解,我认为尽管错误标题是相同的,但他们的问题有所不同。大多数情况下,它们的扁平层存在问题。
来自数据集信息的屏幕截图 enter image description here
这是简单的代码
…
convo_1=…(x_img,shape=[5,5,1,32])
convo_1_pooling=…(convo_1)
convo_2=…(x_img,shape=[5,5,32,64])
convo_2_pooling=…(convo_2)
convo_3=…(x_img,shape=[5,5,64,128])
convo_3_pooling=…(convo_3)
convo_3_flat=tf.reshape(convo_3_pooling,[-1,13*13*128])
full_layer_one=tf.nn.relu(sp.normal_full_layer(convo_3_flat,21632))
# DROPOUT
hold_prob=tf.placeholder(tf.float32)
full_one_dropout=tf.nn.dropout(full_layer_one,keep_prob=hold_prob)
y_pred=sp.normal_full_layer(full_one_dropout,6)
# LOOS FUNCTION
cross_entropy=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y,logits=y_pred))
# OPTIMIZER
optimizer=tf.train.AdamOptimizer(learning_rate=learning_rate)
train=optimizer.minimize(cross_entropy)
with tf.Session() as sess:
sess.run(init)
b=0
for i in range(training_iters):
sess.run(train,feed_dict={x_img:train_x, y:train_y,hold_prob:.5})
if i%2 ==0:
print("NO STEP:{}",format(i))
print("ACCURACY: ")
matches=tf.equal(tf.argmax(y_pred,1),tf.argmax(train_y,1))
acc=tf.reduce_mean(tf.cast(matches,tf.float32))
print(sess.run(acc,feed_dict={x_img:test_x, y:test_y, hold_prob:1.0}))
print('\n')
这是错误
InvalidArgumentError: Incompatible shapes: [30] vs. [237]
[[{{node Equal_1}} = Equal[T=DT_INT64, _device="/job:localhost/replica:0/task:0/device:CPU:0"](ArgMax_2, ArgMax_3)]]
非常感谢
答案 0 :(得分:0)
这一定是发生的,因为在训练模型时,您可能使用了 train_x 或 train_y 数据,而不是通过 feed_dict 占位符的值。
我的代码也发生了类似的情况,经过数小时的调试后问题得以解决。