TensorFlow中feed_dict维度不匹配ValueError问题求助
Error Message : % (np_val.shape, subfeed_t.name, str(subfeed_t.get_shape()))) ValueError: Cannot feed value of shape (100, 32, 32, 3) for Tensor 'Model/resnet_model/dense/BiasAdd:0', which has shape '(100, 10)'
Hey there, I know this issue has been bugging you for two days—let's get it sorted out right away!
核心错误原因
你遇到的形状不匹配问题,根源在于损失函数定义时错把输入图像张量当成了网络输出的logits。
看你loss_setup函数里的这行关键代码:
self.loss = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=self.input_imgs, labels=self.input_labels, name="Error_loss")
这里的logits参数你传入的是self.input_imgs——也就是你在model_setup中定义的输入图像占位符,它的形状是(100,32,32,3);但sparse_softmax_cross_entropy_with_logits期望的logits应该是网络最后输出的、对应每个类别的预测值,也就是你已经确认形状为(100,10)的self.final_output。
当你在训练阶段执行sess.run时,feed_dict给self.input_imgs喂入了形状为(100,32,32,3)的图像数据,但损失函数却试图把这个张量当作(100,10)的logits来计算,自然就会抛出形状不匹配的错误。
修复方案
只需要修改loss_setup中的损失函数定义,将logits参数替换为网络的最终输出self.final_output即可:
def loss_setup(self): # 修正logits参数为网络最终输出self.final_output self.loss = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=self.final_output, labels=self.input_labels, name="Error_loss") self.loss = tf.reduce_mean(self.loss) optimizer = tf.train.AdamOptimizer(0.001, beta1=0.5) self.loss_optimizer = optimizer.minimize(self.loss) # Defining the summary ops self.cl_loss_summ = tf.summary.scalar("cl_loss", self.loss)
这样修改后,损失函数会使用网络输出的(100,10)形状的logits,和你的(100,)形状的标签完美匹配,就不会再出现形状不兼容的问题了。
内容的提问来源于stack exchange,提问作者jonghee Ban

