Skip to main content
 首页 » 编程设计

python之Tensorflow DeepLab : Shape mismatch in tuple component 1. 预期 [x,x,3],得到 [y,y,3]

2025年01月19日31birdshome

我正在尝试使用 deeplab3+使用新数据集(具有不同数量的类)进行微调的 tensorflow 实现。我将数据集转换为 tfrecords 并开始 train模型没有问题。现在我想评估新的检查点,运行 evaluation脚本,我得到一个形状不匹配错误。

tensorflow.python.framework.errors_impl.InvalidArgumentError: Shape mismatch

模型实现使用了tensorflow.slim,我想我的问题是函数相关

slim.evaluation.evaluation_loop( 
    master=FLAGS.master, 
    checkpoint_dir=FLAGS.checkpoint_dir, 
    logdir=FLAGS.eval_logdir, 
    num_evals=num_batches, 
    eval_op=list(metrics_to_updates.values()), 
    max_number_of_evaluations=num_eval_iters, 
    eval_interval_secs=FLAGS.eval_interval_secs, 
    hooks=[tf_debug.LocalCLIDebugHook()])) 

我的错误日志

`tensorflow.python.framework.errors_impl.InvalidArgumentError: Shape mismatch in tuple component 1. Expected [513,513,3], got [2448,2448,3] 
 [[Node: batch/padding_fifo_queue_enqueue = QueueEnqueueV2[Tcomponents=[DT_INT64, DT_FLOAT, DT_STRING, DT_INT32, DT_UINT8, DT_INT64], timeout_ms=-1, _device="/job:localhost/replica:0/task:0/device:CPU:0"](batch/padding_fifo_queue, Reshape_3/_4659, add_2/_4661, Reshape_1, add_3/_4663, case/cond/Merge/_4665, Reshape_6/_4667)]]` 

我不明白这个错误,因为实现使用相同的 preprocessing训练和验证期间的例行程序。我还尝试使用 tf_debug.LocalCLIDebugHook() 进行调试,但没有成功。

请您参考如下方法:

两种解决方案:

  • 只需将 eval_crop_size/vis_crop_size 更改为评估集中的最大图像大小。

  • 使用 tf.image.resize_image_with_pad(不会改变宽高比)或 tf.image.resize_images 调整您的评估大小,使最大图像长度 < 513 (将改变宽高比但不改变填充)

主要原因在input_preprocess.py .下面的代码揭示了如何对输入进行预处理以确保尺寸兼容性:图像被填充(如果它们小于 crop_size),然后被裁剪(仅用于训练)。

# Pad image and label to have dimensions >= [crop_height, crop_width] 
  image_shape = tf.shape(processed_image) 
  image_height = image_shape[0] 
  image_width = image_shape[1] 
 
  target_height = image_height + tf.maximum(crop_height - image_height, 0) 
  target_width = image_width + tf.maximum(crop_width - image_width, 0) 
# Randomly crop the image and label 
  if is_training and label is not None: 
    processed_image, label = preprocess_utils.random_crop( 
        [processed_image, label], crop_height, crop_width)